在PHP中导航搜索结果匹配

时间:2013-09-02 07:08:54

标签: php html regex

搜索结果突出显示:我使用以下代码搜索语料库/文本中的字词。代码位于PHPFiddle。只匹配完整的单词(不区分大小写)。找到所有单词后,匹配的单词将用HTML锚点a标记括起来。所以最终,我可以在调用函数后回显语料库,然后突出显示搜索结果的语料库(取决于我使用的CSS)。

function highlight($corpus, $words) {
    preg_match_all("~\w+~", $words, $m);
    if(!$m) return $corpus;
    $re = "~\\b(" . implode("|", $m[0]) . ")\\b~i";
    return preg_replace($re, "<a href='#'>$0</a>", $corpus);
}

$corpus = "Hello, world! Today is an amazing day!";
echo highlight($corpus, 'hello');

搜索结果导航:如果语料库很大,单独突出显示不会让用户轻松完成匹配。例如,用户可能希望能够通过下一个/上一个按钮按顺序转到每个匹配。为实现这一点,一个想法是为锚添加一个名称属性,即

...
return preg_replace($re, "<a name='$0' href='#'>$0</a>", $corpus);
...

具有内部链接的单独锚点将能够导航到不同的匹配。例如,单击下面的链接将导航到包含name='hello'的锚点。

<a href="#hello">Hello</a>

问题:我遇到的问题是$0属性使用name似乎无法胜任,因为可能存在多个匹配项。请在JSFiddle上查看更长语料库的示例。有没有办法在使用preg_replace时获得一些独特的索引值?或者,是否有办法返回在语料库中找到匹配单词的位置?也许还有另一种更好的方法来获得突出显示和导航。感谢您的意见

1 个答案:

答案 0 :(得分:1)

根据评论中的建议,您可以使用preg_replace_callback,但不需要使用strpos来确定索引。相反,您可以在函数内部使用静态变量,每次调用它时都会递增。

非常基本的示例,它接受字符串'a b c a b c a b c'并将索引附加到字符串'a'的每次出现:

$text = 'a b c a b c a b c';
$text = preg_replace_callback(
           '/a/', 
           function($matches) {
              static $i = 0;
              return $matches[0].$i++;
           }, 
           $text
        );
echo $text;

结果输出:

a0 b c a1 b c a2 b c