php preg_replace проблема при замене нескольких слов - PullRequest
2 голосов
/ 29 февраля 2012

у меня есть следующее регулярное выражение:

$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

Регулярные выражения регистрируются в консоли chrome dev

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

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

1 Ответ

1 голос
/ 29 февраля 2012

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

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

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

...