1

搜索结果突出显示:我正在使用下面的代码来搜索语料库/文本中的单词。代码在PHPFiddle上。仅匹配完整的单词(不区分大小写)。a找到所有单词后,匹配的单词会被 HTML 锚标记包围。所以最终,我可以在调用函数后回显语料库,并获得突出显示搜索结果的语料库(取决于我使用的 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');

搜索结果导航:在语料库很大的情况下,单独突出显示并不能让用户轻松浏览匹配项。例如,用户可能希望能够通过 Next/Previous 按钮按顺序前往每个比赛。为了实现这一点,一个想法是给锚添加一个名称属性,即

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

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

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

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

4

1 回答 1

1

正如评论中所建议的那样,您可以使用preg_replace_callback它,但无需使用strpos来找出索引。相反,您可以在每次调用时递增的函数内部使用静态变量。

非常基本的示例,它采用字符串“abcabcab 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
于 2013-09-02T07:36:59.000 回答