【问题标题】:Higlight keyword in text - optimization在文本中突出显示关键字 - 优化
【发布时间】:2018-12-06 00:30:32
【问题描述】:

我正在开发一个在文本中突出显示关键字的小功能。在我使用正则表达式将原始文本替换为突出显示的文本之前,它也可以工作,但最近我有时间重写这个函数。我需要一些关于性能虎钳或如何改进的帮助。任何对如何改进有任何想法的人都将不胜感激。

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:示例:highlight('prijimac HD815', 'Satelitný prijímač, Amiko HD8155'); 结果:“Satelitný prijímač, Amiko HD8155”

【问题讨论】:

  • 请提供$search$subject 内容的示例。我看到您将其拆分为空格字符?
  • 优化是指纯粹的速度吗?因为我怀疑您发布的内容比基本的正则表达式替换更快。另外我还是看不出iconv的意义。
  • @Jeto 删除特殊字符,ofc。就像他的名字一样。
  • @Scuzzy 我编辑了我的问题并添加了一个示例。谢谢您的回复。

标签: php iconv


【解决方案1】:

这就是我要做的:

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

演示:https://3v4l.org/MUX9b

【讨论】:

  • 谢谢 +Jeto 我喜欢你的方法,我的版本很原始。但它缺乏选择词内部分匹配的功能,因此第二个版本诞生了。但我真的很喜欢它。
  • 哦,我看到您添加了一些示例(编辑 2)。现在没有时间编辑我的答案,但是当我回来时,我会尝试让它更接近你想要的。
  • 删除了 \b 修饰符,因此它现在也可以匹配单词部分。它与您最初的问题的唯一不同之处在于它不会忽略重音字符。
  • 查看我上次的编辑,这也应该处理重音字符。唯一的缺点是您必须手动列出要处理的重音字符。 (注:this answer 提供帮助。)
  • 不错!如果这符合您的需要,您可以根据需要将答案标记为已接受。祝你项目的其余部分好运。
猜你喜欢
  • 2013-04-07
  • 1970-01-01
  • 1970-01-01
  • 2015-03-31
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
  • 2017-10-18
  • 2012-02-10
相关资源
最近更新 更多