如何从字符串中删除不需要的字符?

时间:2009-08-26 08:00:32

标签: php regex string

我正在使用PHP解析一个大文本文件,有些行看起来像“äåòñêèåïåñíè”或“ääò”,或者像“åãîðëåò”。有没有办法检查字符串中是否有超过三个这样的字符?

谢谢。

7 个答案:

答案 0 :(得分:6)

你可以尝试:

if (preg_match("/(?:.*?[\x80-\xFF]){3,}/", $string)) {
  // report excess high-bit ascii
}

(?:           ; create a non-capture group
  .*?         ; match any number of characters, without being greedy.
  [\x80-\xFF] ; match a single high-bit character
)             ; end the group
{3,}          ; match the group 3 or more times

您的问题标题躲过了删除:

$out = preg_replace('/[\x80-\xFF]/', '', $input);

答案 1 :(得分:3)

我使用以下...希望这些帮助...

function just_clean($string)  
{  
// Replace other special chars  
$specialCharacters = array(  
'#' => '',  
'’' => '', 
'`' => '', 
'\'' => '', 
'$' => '',  
'%' => '',  
'&' => '',  
'@' => '',  
'.' => '',  
'€' => '',  
'+' => '',  
'=' => '',  
'§' => '',  
'\\' => '',  
'/' => '',
'`' => '',
'•' => ''
);

while (list($character, $replacement) = each($specialCharacters)) {  
$string = str_replace($character, '', $string);  
}  

$string = strtr($string,  
"ÀÁÂÃÄÅàáâãäåÒÓÔÕÖØòóôõöøÈÉÊËèéêëÇçÌÍÎÏìíîïÙÚÛÜùúûüÿÑñ",  
"AAAAAAaaaaaaOOOOOOooooooEEEEeeeeCcIIIIiiiiUUUUuuuuyNn"  
);  

 // Remove all remaining other unknown characters  
$string = preg_replace('/[^a-zA-Z0-9\-]/', ' ', $string);  
$string = preg_replace('/^[\-]+/', '', $string);  
$string = preg_replace('/[\-]+$/', '', $string);  
$string = preg_replace('/[\-]{2,}/', ' ', $string);  
$string = clean_url($string);  
return $string;  
}

function clean_url($text)
{
$text=strtolower($text);
$code_entities_match = array( '&quot;' ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,';' ,"'" ,',' ,'.' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,'---' ,'--','--','-','’','`','•');
$code_entities_replace = array(' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ' ,' ',' ',' ',' ',' ',' ',' ');
$text = str_replace($code_entities_match, $code_entities_replace, $text);
$text = trim($text," ");
$text=str_replace(" ","-",$text);
$text = cleanUnderScores($text);
return $text;
}

function cleanUnderScores($text)
{
$tst = $text;
$under = "--";
$pos = 0;

    while(strpos($tst, $under) != false )
    {
    //$pos = strpos($tst, $under);
    $tst = str_replace("--", "-", $tst);    
    }
return $tst;
}

答案 2 :(得分:1)

我会避免使用正则表达式。

只需单击字符串,查看每个字符,并计算符合条件的字符数。

答案 3 :(得分:0)

检查:/ [^ \ d \ s \ w] {3,} /

答案 4 :(得分:0)

/X.*?X.*?X/

将X替换为您想要或不想要的任何字符(例如[\x80-\xFF])。

答案 5 :(得分:0)

听起来你可能没有使用正确的character encoding。磁盘上的文件只是字节数组,字符编码的意思是值为77的字节是大写字母M.大多数字符编码的数字0-127映射到相同的字符,但之后,它们都是不同。许多较新的字符编码每个字符使用多个字节,并且通常使用code point而不是字符的概念。

如果您不想破坏和破坏角色数据,您应该对character encodings感到非常满意,尤其是unicode

答案 6 :(得分:0)

你可以这样做:

$string = preg_replace('~&([a-z]{1,2})(acute|cedil|circ|grave|lig|orn|ring|slash|th|tilde|uml);~i', '$1', htmlentities($string, ENT_COMPAT, 'UTF-8'));

这将用等效的ASCII替换所有UTF-8字符。