【问题标题】:regex to also match accented characters正则表达式也匹配重音字符
【发布时间】:2015-07-27 08:52:24
【问题描述】:

我有以下 PHP 代码:

$search = "foo bar que";
$search_string = str_replace(" ", "|", $search);

$text = "This is my foo text with qué and other accented characters.";
$text = preg_replace("/$search_string/i", "<b>$0</b>", $text);

echo $text;

显然,“que”与“qué”不匹配。我该如何改变呢?有没有办法让preg_replace 忽略所有重音符号?

必须匹配的字符(西班牙语):

á,Á,é,É,í,Í,ó,Ó,ú,Ú,ñ,Ñ

我不想在应用正则表达式之前替换所有重音字符,因为文本中的字符应该保持不变:

“这是我的 foo 文本,带有 qué 和其他重音字符。”

而不是

“这是我的 foo 文本,带有 que 和其他重音字符。”

【问题讨论】:

  • 实际上它对我有用。看屏幕截图:- prntscr.com/75gj1w
  • @A-2-A 不。 qué 未突出显示。

标签: php regex character non-ascii-characters accent-insensitive


【解决方案1】:

如果你想在替换字符串中使用捕获的文本,你必须在你的$search变量中使用字符类(无论如何,你手动设置它):

$search = "foo bar qu[eé]"

等等。

【讨论】:

  • 或者,您可以使用一些数组将e 映射到,并将所有出现的vowel 替换为"[" . $dict[$vowel] ."]"
【解决方案2】:

你可以尝试这样定义一个数组:

$vowel_replacements = array(
    "e" => "eé",
    // Other letters mapped to their other versions
);

然后,在您拨打preg_match 之前,请执行以下操作:

foreach ($vowel_replacements as $vowel => $replacements) {
    str_replace($search_string, "$vowel", "[$replacements]");
}

如果我没记错我的 PHP,那应该用它们的重音形式的字符类替换你的元音 - 这将保持它在适当的位置。它还可以让您更轻松地更改搜索字符串;您不必记住用它们的字符类替换元音。您只需要记住在搜索字符串中使用非重音形式。

(如果有一些特殊的语法我忘记了在没有foreach 的情况下执行此操作,请发表评论并告诉我。)

【讨论】:

    【解决方案3】:
    $search = str_replace(
       ['a','e','i','o','u','ñ'],
       ['[aá]','[eé]','[ií]','[oó]','[uú]','[nñ]'],
       $search)
    

    这和大写一样会抱怨你的请求。附注:ñ replacemet 对我来说听起来无效,因为 'niño' 与 'nino' 完全不同

    【讨论】:

    • 我使用 str_ireplace 和你的答案,这正是我所需要的!
    • 该网站是为“懒惰”的人准备的,所以“n”匹配“ñ”是正确的;)
    【解决方案4】:

    我最终使用的解决方案:

    $search_for_preg = str_ireplace(["e","a","o","i","u","n"],
                                    ["[eé]","[aá]","[oó]","[ií]","[uú]","[nñ]"],
                                    $search_string);
    
    $text = preg_replace("/$search_for_preg/iu", "<b>$0</b>", $text)."\n";
    

    【讨论】:

      猜你喜欢
      • 2013-07-03
      • 2023-03-22
      • 1970-01-01
      • 1970-01-01
      • 2015-10-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-07-22
      相关资源
      最近更新 更多