在文本中突出显示关键字 - 优化
Higlight keyword in text - optimization
我正在开发一个在文本中突出显示关键字的小功能。之前我用正则表达式把原来的文本替换成高亮的也行,但最近我有时间重写了这个函数。我需要一些关于性能虎钳或如何改进的帮助。任何对如何改进有任何想法的人,我将不胜感激。
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"
这是我要做的:
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>[=10=]</$htmlTag>", $subject);
}
我正在开发一个在文本中突出显示关键字的小功能。之前我用正则表达式把原来的文本替换成高亮的也行,但最近我有时间重写了这个函数。我需要一些关于性能虎钳或如何改进的帮助。任何对如何改进有任何想法的人,我将不胜感激。
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"
这是我要做的:
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>[=10=]</$htmlTag>", $subject);
}