更换几个单词时,php preg_replace问题

时间:2012-02-29 09:40:04

标签: php regex replace preg-replace words

我有以下正则表达式:

$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控制台

有人可以帮忙吗?谢谢。

编辑:

如果我写正则表达式,它可以正常工作

$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 个答案:

答案 0 :(得分:1)

检查mbstring和mbregex是否可用。 PHP的默认类型ISO-8859-1不包括ő,ű,Ő和Ű以及其他特殊字符(但我假设您只需要这些字符)。 UTF-8可以,但您必须使用多字节函数。

要了解有关mbstring的更多信息,请查看PHP documentation。它也包括mb_ereg_replace。

编辑:我发现使用u标志,preg_repace也可以使用UTF-8。看看this question