很多人提出了有关如何在MySQL全文搜索的结果中突出显示搜索词的问题,但是我发现的解决方案似乎还不够。 MySQL全文搜索支持带引号的多字搜索目标,并忽略任何标点符号。因此,在我的搜索表中,用户可以输入带引号的单词“ quick brown”,而MySQL也将返回包含“ quick,brown”(例如)但不包含“ quick and brown”的行。因此,当在返回的文本中突出显示搜索目标时,似乎需要执行一些正则表达式以确保标识出目标的所有实例。到目前为止,我所拥有的就是这样,其中$ targ包含一个可能的多字搜索词,例如“ quick brown”(但不带引号),而$ blob是我们正在搜索的大文本字符串。它通过用匹配任何非字母数字字符串的正则表达式替换搜索目标中的所有空格来工作。
$pattern = '/' . str_replace(" ", '[^A-Za-z0-9\"]', $targ) . '/i';
$replacement = '<span class="hilite">' . $targ . '</span>';
$blob = preg_replace($pattern, $replacement, $blob);
这通常有效,但是有一个不幸的副作用。实际上,它会从完整字符串中删除多余的标点符号。因此,如果$ blob包含字符串“ quick,brown”,则将其更改为
<span class="hilite">quick brown</span>
因此,它成功在术语周围添加了span标签,但在此过程中,它删除了逗号。
我认为解决方案可能涉及对通配符使用preg_replace,但是一个困难是$ targ中可能包含不同数量的单词。
有什么建议么?谢谢!
最佳答案
您可以使用捕获组轻松完成此操作。同样,当接受用户的模式输入时,最好在使用前对其进行转义。
<?php
$source = 'quick, brown" (for example), but not "quick and brown". So whe';
$test = "QUICK BROWN";
$temp = explode(" ", $test);
// use preg_quote to escape the literal strings
$temp = array_map(function ($val) { return preg_quote($val, "~");}, $temp);
// stitch the literals together with the variable pattern
$pattern = '~('.implode("[^A-Za-z0-9]+", $temp).')~i';
// here the $1 means the result of the first capture group...
// capture group is denoted in the pattern as the text in ().
echo preg_replace( $pattern , '<span class="hilite">$1</span>', $source );
您可以看到正在运行的here。
关于php - PHP从MySQL全文搜索中突出显示多项结果,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/31715664/