【发布时间】: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 我编辑了我的问题并添加了一个示例。谢谢您的回复。