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

Cly*_*yff 5 php regex search special-characters

我发现了很多与此相关的问题,但这些问题都没有帮助我解决我的具体问题。情况:我想搜索string类似的内容"blablebli",并且能够在文本中找到与该内容的所有可能的重音变体( "blablebli""bl\xc3\xa1blebl\xc3\xad"、等...)的匹配项。"bl\xc3\xa2bl\xc3\xa8bli"

\n\n

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

\n\n

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

\n\n
$word="something";\n$word = preg_quote(trim($word)); //Just in case\n$word2 = $this->removeAccents($word); // Removed all accents\nif(!empty($word)) {\n    $sentence = "/(".$word.")|(".$word2.")/ui"; // Now I\'m checking with and without accents.\n    if (preg_match($sentence, $content)){\n        echo "found";\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

和我的removeAccents()功能(我不确定我是否涵盖了所有可能的口音preg_replace()。到目前为止它正在工作。如果有人检查我是否遗漏了任何东西,我将不胜感激):

\n\n
function removeAccents($string)\n{\n    return preg_replace(\'/[\\`\\~\\\']/\', \'\', iconv(\'UTF-8\', \'ASCII//TRANSLIT\', $string));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我试图避免什么:

\n\n
    \n
  • 我知道我可以检查我的$word并将所有内容替换a[a\xc3\xa0\xc3\xa1\xc3\xa3\xc3\xa2\xc3\xa4]其他字母,但我不知道......它看起来有点杀伤力。
  • \n
  • 当然我可以removeAccents()在我的 \n 语句中使用我自己的函数if来检查$content不带重音符号,例如:

    \n\n
    if (preg_match($sentence, $content) || preg_match($sentence, removeAccents($content)))\n
    Run Code Online (Sandbox Code Playgroud)
  • \n
\n\n

但我对第二种情况的问题是我想突出显示比赛后找到的单词。所以我无法改变我的$content.

\n\n

有什么方法可以改进我的功能preg_match()以包含可能的重音字符?或者我应该使用上面的第一个选项?

\n

Cly*_*yff 1

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

\n\n

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

\n\n
function removeAccents($string)\n{\n    return preg_replace(\'/[\\x{0300}-\\x{036f}]/u\', \'\', Normalizer::normalize($string, Normalizer::FORM_KD));\n}\n\nfunction addAccents($string)\n{\n    $array1 = array(\'a\', \'c\', \'e\', \'i\' , \'n\', \'o\', \'u\', \'y\');\n    $array2 = array(\'[a\xc3\xa0\xc3\xa1\xc3\xa2\xc3\xa3\xc3\xa4\xc3\xa5]\',\'[c\xc3\xa7\xc4\x87\xc4\x89\xc4\x8b\xc4\x8d]\',\'[e\xc3\xa8\xc3\xa9\xc3\xaa\xc3\xab]\',\'[i\xc3\xac\xc3\xad\xc3\xae\xc3\xaf]\',\'[n\xc3\xb1]\',\'[o\xc3\xb2\xc3\xb3\xc3\xb4\xc3\xb5\xc3\xb6]\',\'[u\xc3\xb9\xc3\xba\xc3\xbb\xc3\xbc]\',\'[y\xc3\xbd\xc3\xbf]\');\n\n    return str_replace($array1, $array2, strtolower($string));\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

和:

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

顺便说一句,我涵盖了来自我的国家(和其他一些国家)的所有可能的口音。您应该检查是否需要改进addAccents()功能。

\n