Preg_Replace и UTF8 - PullRequest
       17

Preg_Replace и UTF8

4 голосов
/ 14 января 2010

Я расширяю нашу страницу поиска видео , чтобы выделить критерии поиска в результатах. Поскольку пользователь может ввести judas priest, а в видео есть текст Judas Priest, я должен использовать регулярные выражения, чтобы сохранить регистр исходного текста.

Мой код работает, но у меня проблемы со специальными символами, такими как š, č and ž, кажется, что Preg_Replace() будет совпадать только в том случае, если регистр одинаков (несмотря на модификатор /ui). Мой код:

$Content = Preg_Replace ( '/\b(' . $term . '?)\b/iu', '<span class="HighlightTerm">$1</span>', $Content );

Я тоже пробовал это:

$Content = Mb_Eregi_Replace ( '\b(' . $term . '?)\b', '<span class="HighlightTerm">\\1</span>', $Content );

Но это также не работает. Он будет соответствовать "SREČA", если поисковым термином является "SREČA", но если поисковым термином будет "sreča", он не будет совпадать с ним (и наоборот).

Так как мне заставить это работать?

обновление: Я устанавливаю язык и внутреннюю кодировку:

Mb_Internal_Encoding ( 'UTF-8' );
$loc = "UTF-8";
putenv("LANG=$loc");
$loc = setlocale(LC_ALL, $loc);

Ответы [ 3 ]

6 голосов
/ 17 января 2010

Сейчас я чувствую себя действительно глупо, но проблема была не с функциями Preg_ *. Я не знаю почему, но я сначала проверил, находится ли данный термин даже в строке с StriPos, и поскольку эта функция не является многобайтовой, она вернула false, если регистр текста не совпадает поисковый запрос, поэтому Preg_Replace даже не вызывали.

Таким образом, урок, который необходимо извлечь, заключается в том, что всегда используйте многобайтовые версии функций, если у вас есть строки UTF8.

3 голосов
/ 14 января 2010

Не знаю, из-за чего возникла ваша проблема, но я просто собрал небольшой тестовый пример:

<?php

$uc = "SREČA";

mb_internal_encoding('utf-8');
echo $uc."\n";
$lc = mb_strtolower($uc);
echo $lc."\n";

echo preg_replace("/\b(".preg_quote($uc).")\b/ui", "<span class='test'>$1</span>", "test:".$lc." end test");

Это выводится на моей машине:

SREČA
sreča
test:<span class='test'>sreča</span> end test

Кажется, работает нормально?

2 голосов
/ 14 января 2010

Если я не ошибаюсь, preg_match использует текущую локаль. Попробуйте установить язык для языка, к которому принадлежат эти символы. Вы, вероятно, тоже нуждаетесь в локали на основе utf8. Если у вас есть смешанные языки на вашей странице, вы можете найти общий международный язык, который работает.

Смотри также: http://www.phpwact.org/php/i18n/utf-8

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