PHP mb_ereg_replace не заменяется, в то время как preg_replace работает по назначению

Я пытаюсь заменить в строке все несловные символы пустой строкой, ожидающей пробелов, и объединить все несколько пробелов в один пробел.

Следующий код делает это.

$cleanedString = preg_replace('/[^\w]/', ' ', $name);  
$cleanedString = preg_replace('/\s+/', ' ', $cleanedString);

Но когда я пытаюсь использовать mb_ereg_replace, ничего не происходит.

$cleanedString = mb_ereg_replace('/[^\w]/', ' ', $name);  
$cleanedString = mb_ereg_replace('/\s+/', ' ', $cleanedString);

$cleanedString такая же, как если бы $name в приведенном выше случае. Что я делаю не так?


person Jithin    schedule 29.08.2010    source источник


Ответы (3)


mb_ereg_replace не использует разделители. Вы можете или не можете указать кодировку раньше.

mb_regex_encoding("UTF-8");
//regex could also be \W
$cleanedString = mb_ereg_replace('[^\w]', ' ', $name);
$cleanedString = mb_ereg_replace('\s+', ' ', $cleanedString);
person Artefacto    schedule 29.08.2010
comment
Спасибо, это была ошибка, которую я сделал. Если мой ввод UTF-8, есть ли какие-либо рекомендации относительно того, какой метод использовать? - person Jithin; 29.08.2010
comment
@Jithin Если это UTF-8, вы также можете использовать preg_replace с флагом u: preg_replace('/\s+/u', ' ', $cleanedString); - person Artefacto; 29.08.2010
comment
@Artefacto Спасибо. Не могли бы вы сказать мне, безопасно ли предположить, что, пока входные данные находятся в кодировке UTF-8, preg_replace будет работать для большинства языков? - person Jithin; 29.08.2010
comment
@Jithin Зависит от того, что вы имеете в виду под работами. Строго говоря, он будет работать — не будет генерировать поврежденные данные, но, вероятно, он не будет делать то, что вам нужно. Рассмотрим первое регулярное выражение. В PCRE (движок, который использует preg_replace) \w будет означать только [a-zA-Z0-9_]. Если вы хотите исключить все несловесные символы, лучше использовать [^\p{L}\p{Nd}\p{Mn}_]. Это будет соответствовать всем символам, которые не являются (в соответствии с Unicode) буквами, знаками без пробелов (для акцентов и т. д.), десятичными цифрами и символом подчеркивания. - person Artefacto; 29.08.2010
comment
@Artefacto Спасибо. Не будет \w совпадать с символами в зависимости от текущей локали. Таким образом, в зависимости от языка входной строки, если я изменю локаль (используя setlocale()), это не сработает. Или подход неверный? При работе в контексте веб-сервера, такого как apache, я не знаю, влияет ли локаль на настройку базовой системы или зависит от входного запроса. - person Jithin; 29.08.2010
comment
@Jithin Нет, это не зависит от локали. - person Artefacto; 29.08.2010
comment
@Артефакт . Спасибо еще раз. Но я читал, что для PCRE \w зависит от локали. perldoc.perl.org/perlrecharclass.html#последовательности с обратной косой чертой - person Jithin; 29.08.2010
comment
Извини, я виноват. Я смотрел неправильную документацию. Это было для перла. :D - person Jithin; 29.08.2010
comment
@Jithin См. справочную страницу для PCRE здесь, Общие комментарии о режиме UTF-8, пункт 6 . - person Artefacto; 29.08.2010
comment
@Artefacto Большое спасибо. Еще одно сомнение. Использует ли mb_ereg_replace PCRE? Ведет ли шаблон регулярного выражения одинаково с mb_ereg_replace? - person Jithin; 29.08.2010
comment
@Jithin Нет. Он использует oniguruma. По умолчанию \w означает (Буква|Отметка|Число|Разъем_Пунктуация). - person Artefacto; 29.08.2010
comment
@Artefacto Хм, так многому нужно научиться. :| . Из документации geocities.jp/kosako3/oniguruma/doc/RE.txt, похоже, что для ввода юникода \w может дать истинную рабочую границу. Есть ли какие-либо рекомендации по использованию между preg_replace и mb_ereg_replace? Но я думаю, что preg_replace изначально доступен в php, может быть быстрее. - person Jithin; 29.08.2010
comment
@Jithin Они оба изначально доступны (ну, на самом деле PCRE нельзя исключить из PHP 5.3, но это не должно влиять на скорость). Однако вы обнаружите, что функции интерфейса PHP PCRE (семейство preg_) проще в использовании и лучше документированы. Если бы мне пришлось угадывать, я бы сказал, что PCRE также быстрее. - person Artefacto; 29.08.2010
comment
@Artefacto Я столкнулся с другой проблемой, связанной с символами, содержащими горизонтальные пробелы. [^\p{L}\p{Nd}\p{Mn}_] нужно было изменить на [^\p{L}\p{Nd}\p{Mn}\p{Mc}_] для соответствия также метки интервалов. Я задал этот вопрос здесь stackoverflow.com/questions/3598212/ - person Jithin; 30.08.2010

function create_slug_html($string, $ext='.html'){     
   $replace = '-';         
   $string=strtolower($string);     
   $string=trim($string);

    mb_regex_encoding("UTF-8");
    //regex could also be \W
    $string= mb_ereg_replace('[^\w]', ' ', $string);
    $string= mb_ereg_replace('\s+', ' ', $string);

   //remove query string     
   if(preg_match("#^http(s)?://[a-z0-9-_.]+\.[a-z]{2,4}#i",$string)){         
         $parsed_url = parse_url($string);         
         $string = $parsed_url['host'].' '.$parsed_url['path'];         
         //if want to add scheme eg. http, https than uncomment next line         
         //$string = $parsed_url['scheme'].' '.$string;     
   }      
   //replace / and . with white space     
   $string = preg_replace("/[\/\.]/", " ", $string);   

   // $string = preg_replace("/[^a-z0-9_\s-]/", "", $string);  

   //remove multiple dashes or whitespaces     
   $string = preg_replace("/[\s-]+/", " ", $string);   

   //convert whitespaces and underscore to $replace     
   $string = preg_replace("/[\s_]/", $replace, $string);     
   //limit the slug size     
   $string = substr($string, 0, 200);     
   //slug is generated     
   return ($ext) ? $string.$ext : $string; 

}

пожалуйста, проверьте, все ли в порядке и поддерживаете английский язык и юникод

person Pramod Verma    schedule 24.07.2016
comment
Хотя ответы только на код не запрещены, пожалуйста, поймите, что это сообщество вопросов и ответов, а не краудсорсинговое, и что, как правило, если бы ОП понимал код, публикуемый как ответ, он / она бы придумал с аналогичным решением самостоятельно, и в первую очередь не задавал бы вопрос. В связи с этим предоставьте контекст своего ответа и/или кода, объяснив, как и/или почему это работает. - person XenoRo; 24.07.2016

Ввод не является многобайтовым, поэтому функция mb не работает.

person shamittomar    schedule 29.08.2010
comment
Ok. Но не могли бы вы объяснить, когда мы должны использовать mb_ereg_replace вместо preg_replace, если мой ввод в UTF-8. В настоящее время я передал английский текст как $name. Но если завтра я буду использовать какой-нибудь другой язык, скажем, хинди, не сломается ли мой код? - person Jithin; 29.08.2010
comment
Неправильный. Многобайтовое расширение может обрабатывать однобайтовые кодировки. - person Artefacto; 29.08.2010