2012-02-29 4 views
2

у меня есть следующее регулярное выражение:PHP preg_replace проблемы при замене несколько слов

$patterns = array 
(
    '/\b(gubalowka hegy)\b/i', 
    '/\b(krakkó|wawel|wawelban|auschwitz|auschwitzba|auschwitz-birkenua)\b/i', 
    '/\b(királyi|város|fogaskerekű|séta)\b/i', 
); 

$replaces = array 
(
    '<strong>$1</strong>', 
    '<u><em>$1</em></u>', 
    '<strong>$1</strong>', 
); 

preg_replace($patterns, $replaces, $text); 

Проблема заключается в том, что только некоторые слова заменяются.

На этом примере только эти слова:

Séta    => <strong>Séta</strong> 
Krakkó    => <u><em>Krakkó</em></u> 
királyi   => <strong>királyi</strong> 
Auschwitz-Birkenua => <u><em>Auschwitz-Birkenua</em></u> 

Другие слова остаться нетронутыми.

Я попытался заставить его работать несколькими способами (заменяя каждое слово отдельно, заменяя группу слов без массивов), но ни один из них не работал.

Здесь Вы можете проверить это: http://adriaholiday.dev.webndev.hu/ajanlatok/lengyelorszagi-hetvege.html

регулярные выражения, нужно регистрироваться в хромированной консоли разработчика

Может кто-нибудь помочь? Спасибо.

Edit:

Если я пишу регулярное выражение, он работает

$pattern = '/\b(krakkó|wawel|wawelban|auschwitz|auschwitzba)\b/iu' 
$replace = '<strong><u>$1</u></strong>'; 
$text = preg_replace($pattern, $replace, $text); 

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

$replace = '<strong>$1</strong>'; 

foreach (...) 
{ 
    $words .= "|{$word}"; // first vertical bar removed ... 
} 

// encoding UTF8 
// pattern: /\b(krakkó|wawel|wawelban|auschwitz|auschwitzba)\b/iu 
$pattern = '/\b(' . $words . ')\b/iu'; 

$text = preg_replace($pattern, $replace, $text); 
+0

Это может быть проблема с ascii vs unicode - я долго не много делал с регулярным выражением php, но это может быть область для просмотра. Насколько хорошо php обрабатывает регистрозависимые строки unicode? –

+0

добавьте 'u' к вашим модификаторам ('/foo/iu'), чтобы сообщить PCRE, чтобы обработать шаблон как UTF-8. см. http://php.net/manual/en/reference.pcre.pattern.modifiers.php – rodneyrehm

+0

Я пробовал «u» уже, это не помогает – csanyigabor

ответ

1

Проверьте, MBstring и mbregex доступен. Тип по умолчанию PHP, ISO-8859-1 не включает в себя ő, ű, Ő и Ű и другие специальные символы (но я предполагаю, что вам понадобятся только эти). UTF-8 делает, но вам придется использовать многобайтовые функции с этим.

Чтобы узнать больше о mbstring, посмотрите на PHP documentation. Он также включает mb_ereg_replace.

EDIT: Я узнал, что с флагом u preg_repace также может использовать UTF-8. Взгляните на this question.

+0

Я попробовал это с флагом u, но это не так, я ничего не меняю, теперь я пытаюсь выполнить mb_ereg_replace – csanyigabor