在PHP中导航搜索结果匹配项



搜索结果突出显示:我使用下面的代码在语料库/文本中搜索单词。该代码位于PHPIdle上。只匹配完整的单词(不区分大小写)。在它找到所有单词后,匹配的单词用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>

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

正如注释中所建议的,您可以使用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

最新更新