php正则表达式匹配可能的重音字符

时间:2015-07-25 13:48:40

标签: php regex search special-characters

我发现了很多关于此的问题,但没有一个能帮我解决我的特殊问题。情况:我希望使用list = [ ['b', 'a'], ['d', 'c'], ['f', 'e'], ] 之类的内容搜索string,并且能够找到与所有可能的重音变体匹配的匹配项("blablebli""blablebli",{{ 1}}等等......在文本中。

我已经做了相反的解决方法(找到一个没有我写的可能的重音的单词)。但我无法弄清楚实现我想要的方式。

这是我的工作代码。 (相关部分,这是foreach的一部分,所以我们只看到一个单词搜索):

"blábleblí"

我的"blâblèbli"功能(我不确定我是否用$word="something"; $word = preg_quote(trim($word)); //Just in case $word2 = $this->removeAccents($word); // Removed all accents if(!empty($word)) { $sentence = "/(".$word.")|(".$word2.")/ui"; // Now I'm checking with and without accents. if (preg_match($sentence, $content)){ echo "found"; } } 覆盖了所有可能的口音。到目前为止它已经正常工作。如果有人检查我是否感谢,我将不胜感激。 #39;我遗漏了什么):

removeAccents()

我想避免的事情:

  • 我知道我可以查看我的preg_replace()并将所有function removeAccents($string) { return preg_replace('/[\`\~\']/', '', iconv('UTF-8', 'ASCII//TRANSLIT', $string)); } 替换为$word和。{ 与其他字母相同的东西,但我不知道......它看起来像一个痘痘 矫枉过正。
  • 确定我可以在a中使用我自己的[aàáãâä]功能 声明检查removeAccents()没有重音符号,如:

    if

但我对第二种情况的问题是我希望在比赛结束后发现这个词。所以我无法更改$content

有没有办法改进我的if (preg_match($sentence, $content) || preg_match($sentence, removeAccents($content))) 以包含可能的重音字符?或者我应该使用上面的第一个选项吗?

2 个答案:

答案 0 :(得分:2)

我会分解字符串,这样可以更容易地删除有问题的字符,这就行了:

<?php

// Convert unicode input to NFKD form.
$str = Normalizer::normalize("blábleblí", Normalizer::FORM_KD);

// Remove all combining characters (https://en.wikipedia.org/wiki/Combining_character).
var_dump(preg_replace('/[\x{0300}-\x{036f}]/u', "", $str));

答案 1 :(得分:0)

感谢大家的帮助,但是我会用我在问题中提出的第一个消息来结束它。再次感谢@CasimiretHippolyte的耐心,并让我意识到这并不像我想的那样矫枉过正。

以下是我使用的最终代码(首先是函数):

function removeAccents($string)
{
    return preg_replace('/[\x{0300}-\x{036f}]/u', '', Normalizer::normalize($string, Normalizer::FORM_KD));
}

function addAccents($string)
{
    $array1 = array('a', 'c', 'e', 'i' , 'n', 'o', 'u', 'y');
    $array2 = array('[aàáâãäå]','[cçćĉċč]','[eèéêë]','[iìíîï]','[nñ]','[oòóôõö]','[uùúûü]','[yýÿ]');

    return str_replace($array1, $array2, strtolower($string));
}

$word="something";
$word = preg_quote(trim($word)); //Just in case
$word2 = $this->addAccents($this->removeAccents($word)); //check all possible accents
if(!empty($word)) {
    $sentence = "/(".$word.")|(".$word2.")/ui"; // Now I'm checking my normal word and the possible variations of it.
    if (preg_match($sentence, $content)){
        echo "found";
    }
}

顺便说一句,即时通讯涵盖了我国(和其他一些国家)的所有可能的口音。您应该在使用之前检查是否需要改进addAccents()功能。