我想在格式化的数字上突出显示我的搜索查询。
例如:
$search_query = '1234'; // or $search_query = '7800';
$formatted_numeber = '12,345,678.00';
目前我的代码是:
preg_replace('/(' . $search_query . ')/i', "<span style='background: yellow'>$1</span>", $formatted_numeber);
但是由于存在逗号 (,) 和小数点 (.),此代码无法突出显示像 '1234' 、 '7800' 这样的搜索子句
我也希望它能够与搜索查询中存在逗号和小数的情况一起使用。
例如:
$search_query = '3,456';
$formatted_numeber = '12,345,678.00';
我想突出显示格式化号码上的“345,6”部分。
或者:
$search_query = '7.80';
$formatted_numeber = '12,345,678.00';
我想突出显示格式化号码上的“78.0”部分。
考虑到得到答案需要多长时间,我想我们可以得出结论,这不是一个小问题。
我认为,尽管您没有明确这么说,但您实际上只想突出显示格式化的数字,并且这些数字没有嵌入到更大的文本中。我还假设您只想突出显示数字的一部分,而不是多个部分。因此,在
12,341,234.00
中,只有第一个 1234
会突出显示。
我的解决方案是一个真正的算法,而不是基于复杂的内置函数或正则表达式。这当然是可能的,但我避开了它们。
function highlight(string $search, string $number)
{
$searchBegin = NULL;
$searchIndex = 0;
$search = str_replace([',', '.'], '', $search);
foreach (str_split($number) as $numberIndex => $character) {
if ($character == $search[$searchIndex]) {
if (is_null($searchBegin)) {
$searchBegin = $numberIndex;
}
$searchIndex++;
if ($searchIndex == strlen($search)) {
return substr($number, 0, $searchBegin) .
'<span style="background: yellow">' .
substr($number, $searchBegin, $numberIndex - $searchBegin + 1) .
'</span>' .
substr($number, $numberIndex +1);
}
} elseif (!in_array($character, [',', '.'])) {
$searchBegin = NULL;
$searchIndex = 0;
}
}
return $number;
}
我认为代码是不言自明的。只要遵循它是什么,你就会理解它。这没什么神秘的。
此代码未经过优化,其目的是作为进一步优化的起点。能够突出显示多个部分将是我要做的第一件事。
str_split()
很方便,但不是很快,您可以通过使用 for
循环和字符串索引轻松地使该函数更快。