Я не могу найти решение для выделения совпадений в PHP с игнорированием символов UTF8.
Пример кода:
$text = "Lorem Ipsum – tas ir teksta salikums, kuru izmanto poligrāfijā un maketēšanas darbos. Lorem Ipsum ir kļuvis par vispārpieņemtu teksta aizvietotāju kopš 16. gadsimta sākuma. Tajā laikā kāds nezināms iespiedējs izveidoja teksta fragmentu, lai nodrukātu grāmatu ar burtu paraugiem.";
$keywordsNotWorking = ["poligrafija", "kops"];
$keywordsWorking = ["poligrāfijā", "kopš"];
function highlightFoundText($text, $keywords, $tag = "b")
{
foreach ($keyword as $key){
$text = preg_replace("/\p{L}*?".preg_quote($key)."\p{L}*/ui", "<".$tag.">$0</".$tag.">", $text);
}
return $text;
}
Если я использую $keywordsWorking, тогда все в порядке, но при использовании $keywordsNotWorking результатов не найдено.
Пожалуйста, помогите мне найти решение, как выделить совпадения с игнорированием символов UTF8.
@ WiktorStribiżew Спасибо за предложение, но я не нашел там ответа, это мне помогло.
Также проверьте это рево ответ.
@ WiktorStribiżew Я уже написал свой код :) Вы можете видеть это как ответ. В любом случае спасибо за вашу активность.






Наконец-то я принял рабочее решение. Отправьте ответ, если кто-то подойдет к тому же вопросу.
class Highlighter
{
private $_text;
private $_keywords;
private $keywords;
private $text;
private $tag = "b";
public function highlight($text, $keywords)
{
$this->text = $text;
$this->keywords = (array) $keywords;
if (count($keywords) > 0)
{
$this->prepareString();
$this->highlightStrings();
}
return $this->text;
}
private function unicodeSymbols()
{
return [
'ā' => 'a',
'č' => 'c',
'ē' => 'e',
'ī' => 'i',
'ķ' => 'k',
'ļ' => 'l',
'ņ' => 'n',
'š' => 's',
'ū' => 'u',
'ž' => 'z'
];
}
private function clearVars()
{
$this->_text = null;
$this->_keywords = [];
}
private function prepareString()
{
$this->clearVars();
$this->_text = strtolower( strtr($this->text, $this->unicodeSymbols()) );
foreach ($this->keywords as $keyword)
{
$this->_keywords[] = strtolower( strtr($keyword, $this->unicodeSymbols()) );
}
}
private function highlightStrings()
{
foreach ($this->_keywords as $keyword)
{
if (strlen($keyword) === 0) continue;
// find cleared keyword in cleared text.
$pos = strpos($this->_text, $keyword);
if ($pos !== false)
{
$keywordLength = strlen($keyword);
// find original keyword.
$originalKeyword = mb_substr($this->text, $pos, $keywordLength);
// highlight in both texts.
$this->text = str_replace($originalKeyword, "<{$this->tag}>".$originalKeyword."</{$this->tag}>", $this->text);
$this->_text = str_replace($keyword, "<{$this->tag}>".$keyword."</{$this->tag}>", $this->_text);
}
}
}
public function setTag($tag)
{
$this->tag = $tag;
}
}
Проверить Regex для соответствия строке со специальными / акцентированными символами и без них?