Cly*_*yff 5 php regex search special-characters
我发现了很多与此相关的问题,但这些问题都没有帮助我解决我的具体问题。情况:我想搜索string
类似的内容"blablebli"
,并且能够在文本中找到与该内容的所有可能的重音变体( "blablebli"
、"bl\xc3\xa1blebl\xc3\xad"
、等...)的匹配项。"bl\xc3\xa2bl\xc3\xa8bli"
我已经采取了相反的解决方法(找到一个我写的没有可能重音的单词)。但我无法找出实现我想要的方法。
\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()
。到目前为止它正在工作。如果有人检查我是否遗漏了任何东西,我将不胜感激):
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$word
并将所有内容替换a
为[a\xc3\xa0\xc3\xa1\xc3\xa3\xc3\xa2\xc3\xa4]
其他字母,但我不知道......它看起来有点杀伤力。当然我可以removeAccents()
在我的 \n 语句中使用我自己的函数if
来检查$content
不带重音符号,例如:
if (preg_match($sentence, $content) || preg_match($sentence, removeAccents($content)))\n
Run Code Online (Sandbox Code Playgroud)但我对第二种情况的问题是我想突出显示比赛后找到的单词。所以我无法改变我的$content
.
有什么方法可以改进我的功能preg_match()
以包含可能的重音字符?或者我应该使用上面的第一个选项?
感谢大家的帮助,但我将使用我在问题中提出的第一个建议来结束它。再次感谢@CasimiretHippolyte 的耐心,让我意识到这并不像我想象的那么矫枉过正。
\n\n这是我使用的最终代码(首先是函数):
\n\nfunction 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()
功能。