Как я могу сопоставить русское слово, используя preg_replace в PHP? - PullRequest
7 голосов
/ 19 января 2011

Как мне найти русское слово в строке (также на русском) в PHP?

Так, например, что-то вроде этого:

$pattern = '/слово/';
preg_replace($pattern, $replacement, $string_in_russian)

Я пробовал utf8_encode и htmlentities с флагом UTF-8 для $ pattern, но это не сработало. Должен ли я также кодировать $ string_in_russian?

Обновление: Предложение для флага / u не сработало, поэтому я помещаю фактический код, для которого мне это нужно. Это из плагина глоссария для Wordpress (мой сайт правильно настроен на использование русского языка, и он работает, но не в этом случае). Так вот код

$glossary_title = $glossary_item->post_title;
$glossary_search = '/\b'.$glossary_title.'s*?\b(?=([^"]\*"[^"]\*")\*[^"]*$)/iu';
$glossary_replace = '<a'.$timestamp.'>$0</a'.$timestamp.'>';
$content_temp = preg_replace($glossary_search, $glossary_replace, $content, 1);

Когда я делаю быстрый эхо в комментарии HTML, я получаю такую ​​строку для шаблона
/\bсловоs*?\b(?=([^"]*"[^"]<em>")</em>[^"]*$)/iu

И, похоже, это все еще не работает. Я подумал, что, может быть, именно «я» идиотило меня (этот уровень регулярных выражений немного выше меня, но я предполагаю, что он существует для возможных множественных чисел), но его удаление не помогло.

Обновление № 2: Хорошо, поэтому я решил сделать полный тест "чистого листа" - простой PHP-файл с некоторыми строками $ content на английском и русском языках и целевыми словами для замены. Вот код

$content_en = 'Nulla volutpat pretium nunc, ac feugiat neque lobortis vitae. In eu sapien sit amet eros tincidunt viverra. <b style="color:purple">Proin</b> congue hendrerit felis, et consequat neque ultrices lobortis. <b style="color:purple">Proin</b> luctus bibendum libero et molestie. Sed tristique lacus a urna semper eget feugiat lacus varius. Donec vel sodales diam. <b style="color:purple">Proin</b> fringilla laoreet purus, a facilisis nisi porttitor vel. Nullam ac justo ac elit laoreet ullamcorper vel a magna. Suspendisse in arcu sapien.';
$find_en = 'proin';
$replace_with_en = '<em style="color:red">REPLACEMENT</em>';
$glossary_search = '/\b'.$find_en.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu';
$content_en_replaced = preg_replace($glossary_search, $replace_with_en, $content_en);

$content_ru = 'Lorem Ipsum используют потому, что тот обеспечивает более или менее стандартное заполнение шаблона, а также реальное распределение букв и пробелов в абзацах, которое не получается при простой дубликации "Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.. Здесь <b style="color:purple">ваш</b> текст.." Многие программы электронной вёрстки и редакторы HTML используют Lorem Ipsum в качестве текста по умолчанию.';
$find_ru = 'ваш';
$replace_with_ru = '<em style="color:red">Многие</em>';
$glossary_search = '/\b'.$find_ru.'s*?\b(?=([^"]*"[^"]*")*[^"]*$)/iu';
$content_ru_replaced = preg_replace($glossary_search, $replace_with_ru, $content_ru);

А вот и скриншот с выводом http://www.flickr.com/photos/iliadraznin/5372578707/

Как видите, в английском тексте заменено целевое слово, а в русском - нет, а код идентичен, и я использую флаг / u. Файл также имеет кодировку UTF-8. Какие-либо предложения? (и снова я попытался удалить "s", все еще ничего)

Ответы [ 3 ]

7 голосов
/ 20 января 2011

Если вы выполните настоящий тест с чистого листа, вы поймете, что с русским нет ничего плохого - на самом деле это аспект границы слова, который нарушает регулярное выражение.

$glossary_search = '/'.$find_ru.'/iu'; // Works fine
$glossary_search = '/\b'.$find_ru.'\b/iu'; // Breaks

Сокращение границы слова не поддерживается UTF-8, поэтому, по этому вопросу: Соответствие границы слова php regex в utf-8 вы можете попробовать следующее:

$glossary_search = '/(?<!\pL)'.$find_ru.'(?!\pL)/iu';

Это хорошо работает на моем тесте здесь.

1 голос
/ 20 января 2011

Для начала, вы должны убедиться, что ваш php файл закодирован в формате UTF-8.Даже если в файле нет символов UTF-8 (они могут передаваться из другого файла), файл должен быть UTF-8, чтобы функции внутри него могли работать с UTF-8.

0 голосов
/ 25 февраля 2011
Опция

"u" в регулярных выражениях PCRE предоставляет Unicode, поэтому:

<?php
  $str = 'тест бла бла бла';
  if(preg_match("'тест'isu", $str, $match))
  {
    echo $match;
  }
?>

Также, пример для preg_replace:

<?php
  $str = 'тест бла бла бла';
  echo preg_replace("'бла'isu", '', $str);
?>
...