Php 文本优化中的Higlight关键字

Php 文本优化中的Higlight关键字,php,iconv,Php,Iconv,我正在研究一个小函数,它在文本中突出显示关键字。以前,我使用正则表达式将原始文本替换为高亮显示的文本,但最近我有时间重写此函数。我需要一些关于性能虎钳或如何改进的帮助。任何人谁有任何想法如何改善我会感谢一个帮助 function highlight($search, $subject, $htmlTag = 'mark') { if (empty($search) === true) { return $subject; } $searchParts =

我正在研究一个小函数,它在文本中突出显示关键字。以前,我使用正则表达式将原始文本替换为高亮显示的文本,但最近我有时间重写此函数。我需要一些关于性能虎钳或如何改进的帮助。任何人谁有任何想法如何改善我会感谢一个帮助

function highlight($search, $subject, $htmlTag = 'mark')
{
    if (empty($search) === true) {
        return $subject;
    }

    $searchParts = explode(' ', str_replace("'", '', iconv('UTF-8', 'ASCII//TRANSLIT', $search)));
    $subjectParts = explode(' ', str_replace("'", '', iconv('UTF-8', 'ASCII//TRANSLIT', $subject)));
    $originalSubject = explode(' ', $subject);
    $result = [];

    foreach ($subjectParts as $row => $subjectPart) {
        foreach ($searchParts as $searchPart) {
            if (false !== $pos = stripos($subjectPart, $searchPart)) {
                $result[] = mb_substr($originalSubject[$row], 0, $pos) . '<' . $htmlTag . '>' . mb_substr($originalSubject[$row], $pos, mb_strlen($searchPart)) . '</' . $htmlTag . '>' . mb_substr($originalSubject[$row], $pos + mb_strlen($searchPart));

                continue 2;
            }
        }

        $result[] = $originalSubject[$row];
    }

    return implode(' ', $result);
}
编辑:需要iconv,因为此函数将替换包含重音字符的文本


编辑2:示例:突出显示“prijimac HD815”、“Sateltinýprijímač、Amiko HD8155”;结果:Sateltinýprijímač,Amiko HD8155

function prepare($pattern)
{
  // Add any other accented character you wanna handle
  $replacements = [
    'a' => '[aáàäâ]',
    'c' => '[cč]',
    'e' => '[eéèëê]',
    'i' => '[ií]',
    'y' => '[yý]'
  ];

  return str_replace(array_keys($replacements), $replacements, $pattern);
}

function highlight($search, $subject, $htmlTag = 'mark')
{
  $pattern = '/' . preg_replace('/\s+/', '|', prepare(preg_quote(trim($search)))) . '/u';

  return preg_replace($pattern, "<$htmlTag>$0</$htmlTag>", $subject);
}

演示:

请举例说明$search和$subject内容可能是什么样子。我看到你把它分成了空格字符?你说的优化是指纯粹的速度吗?因为我怀疑你发布的内容比基本正则表达式替换快。另外,我仍然不明白iconv的意义。@Jeto删除特殊字符,ofc。就像他名字里的那个。@Scuzzy我编辑了我的问题并添加了一个例子。谢谢你的回复。谢谢你+杰托我喜欢你的方法,我的版本很原始。但是它缺乏在单词内部选择部分匹配的特性,因此第二个版本诞生了。不过我还是很喜欢。哦,我看到你添加了一些例子编辑2。现在没有时间编辑我的答案,但当我回来后,我会尝试使答案更接近您想要的答案。删除了\b修饰符,以便它现在也可以匹配单词部分。它唯一不同于您最初的问题的地方是它不会忽略重音字符。请参阅我上一次的编辑,这应该也会处理重音字符。唯一的缺点是您必须手动列出要处理的重音字符。注:帮助。很好!如果这符合您的需要,您可以根据需要将答案标记为已接受。祝你接下来的项目好运。