Как удалить ненужные символы из строки? - PullRequest
1 голос
/ 26 августа 2009

Я анализирую большой текстовый файл с использованием PHP, и некоторые строки выглядят так: «Вышло», или «Я», или как это «Я хочу». Есть ли способ проверить, есть ли в строке более трех символов, подобных этому?

Спасибо.

Ответы [ 7 ]

6 голосов
/ 26 августа 2009

Вы можете попробовать:

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);
3 голосов
/ 26 августа 2009

Я пользуюсь ниже ... надеюсь, это поможет ...

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;
}
1 голос
/ 26 августа 2009

Я бы избегал регулярных выражений.

Просто пройдитесь по строке, просматривая каждый символ, и ведите счет количества символов, соответствующих вашим критериям.

0 голосов
/ 26 августа 2009

Вы можете сделать:

$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'));

Это заменит все символы UTF-8 на их эквивалент ASCII.

0 голосов
/ 26 августа 2009

Похоже, вы не используете правильную кодировку . Файл на диске - это просто массив байтов, а кодировка символов - это идея о том, что байт со значением 77 является заглавной буквой M. Большинство кодировок символов имеют номера 0-127, сопоставляемые одним и тем же символам, но после этого все они разные. Многие новые кодировки символов используют более одного байта на символ и часто используют понятие кодовая точка вместо символа.

Вам должно стать по-настоящему удобно с кодировками , особенно Юникод , если вы не хотите искажать, и испортить данные символов.

0 голосов
/ 26 августа 2009
/X.*?X.*?X/

Замените X на любые символы, которые вы хотите или не хотите (например, [\x80-\xFF]).

0 голосов
/ 26 августа 2009

Проверьте с помощью: / [^ \ d \ s \ w] {3,} /

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...