【问题标题】:PHP Highlight Multiterm Results from MySQL Full Text SearchPHP 高亮 MySQL 全文搜索的多词条结果
【发布时间】:2015-10-21 07:58:14
【问题描述】:

很多人都问过如何在 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 mysql search full-text-search preg-replace


    【解决方案1】:

    您可以使用捕获组轻松完成此操作。此外,当接受用户对模式的输入时,最好在使用它之前对其进行转义。

    <?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

    【讨论】:

    • 谢谢,橙丸!您的解决方案完美运行。我也很感谢您与 3v4l.org 的链接,在那里我可以使用不同的输入快速试验代码。
    猜你喜欢
    • 2012-01-21
    • 2018-12-10
    • 2012-11-27
    • 2015-07-08
    • 2019-03-08
    • 1970-01-01
    • 1970-01-01
    • 2023-03-13
    • 1970-01-01
    相关资源
    最近更新 更多