正则表达式也匹配重音字符

时间:2015-05-15 12:16:48

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

我有以下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 和其他重音字符。”

4 个答案:

答案 0 :(得分:1)

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

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

等等。

答案 1 :(得分:1)

$search = str_replace(
   ['a','e','i','o','u','ñ'],
   ['[aá]','[eé]','[ií]','[oó]','[uú]','[nñ]'],
   $search)

这个和大写相同会抱怨你的请求。旁注:ñ替换声音对我来说无效,因为'niño'与'nino'完全不同

答案 2 :(得分:1)

我最终使用的解决方案:

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

答案 3 :(得分:0)

您可以尝试定义这样的数组:

$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,请发表评论告诉我。)