我正在使用PHP解析一个大文本文件,有些行看起来像“äåòñêèåïåñíè”或“ääò”,或者像“åãîðëåò”。有没有办法检查字符串中是否有超过三个这样的字符?
谢谢。
答案 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( '"' ,'!' ,'@' ,'#' ,'$' ,'%' ,'^' ,'&' ,'*' ,'(' ,')' ,'+' ,'{' ,'}' ,'|' ,':' ,'"' ,'<' ,'>' ,'?' ,'[' ,']' ,';' ,"'" ,',' ,'.' ,'_' ,'/' ,'*' ,'+' ,'~' ,'`' ,'=' ,'---' ,'--','--','-','’','`','•');
$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字符。