我发现了很多关于此的问题,但没有一个能帮我解决我的特殊问题。情况:我希望使用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)))
以包含可能的重音字符?或者我应该使用上面的第一个选项吗?
答案 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()
功能。