【问题标题】:php preg_replace issue while replacing several words替换几个单词时的php preg_replace问题
【发布时间】:2012-03-18 19:04:51
【问题描述】:

我有以下正则表达式:

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

有人可以帮忙吗?谢谢。

编辑:

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

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

【问题讨论】:

  • 这可能是 ascii 与 unicode 的问题 - 我很长时间没有使用 php regex 做太多事情,但这可能是一个值得关注的领域。 php 处理不区分大小写的 unicode 字符串有多好?
  • u 添加到您的修饰符 (/foo/iu) 以告诉 PCRE 将模式视为 UTF-8。见php.net/manual/en/reference.pcre.pattern.modifiers.php
  • 我已经试过“u”了,没用
  • 连接后,$word 的剩余管道错误!!!另外,正如其他提到的,需要“u”修饰符
  • $pattern 变量包含:/\b(krakkó|wawel|wawelban|auschwitz|auschwitzba)\b/iu

标签: php regex replace preg-replace words


【解决方案1】:

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

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

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

【讨论】:

  • 我用 u 标志试过了,但它没有改变任何东西,我现在用 mb_ereg_replace 试试
猜你喜欢
  • 2013-05-05
  • 2016-08-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多