Как выделить строку, отличную от utf8, в тексте utf8 в PHP?

Я не могу найти решение для выделения совпадений в 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 Спасибо за предложение, но я не нашел там ответа, это мне помогло.

AlexIL 05.10.2018 11:28

Также проверьте это рево ответ.

Wiktor Stribiżew 05.10.2018 11:39

@ WiktorStribiżew Я уже написал свой код :) Вы можете видеть это как ответ. В любом случае спасибо за вашу активность.

AlexIL 05.10.2018 11:57
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
0
4
78
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Наконец-то я принял рабочее решение. Отправьте ответ, если кто-то подойдет к тому же вопросу.

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;
    }
}

Другие вопросы по теме