如何在基于搜索查询的格式化数字上使用 PHP preg_replace,同时忽略逗号和小数?

问题描述 投票:0回答:1

我想在格式化的数字上突出显示我的搜索查询。

例如:

$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”部分。

php preg-replace
1个回答
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;
}

现场演示:https://3v4l.org/StFn7

我认为代码是不言自明的。只要遵循它是什么,你就会理解它。这没什么神秘的。

此代码未经过优化,其目的是作为进一步优化的起点。能够突出显示多个部分将是我要做的第一件事。

str_split()
很方便,但不是很快,您可以通过使用
for
循环和字符串索引轻松地使该函数更快。

© www.soinside.com 2019 - 2024. All rights reserved.