搜索结果突出显示:我使用以下代码搜索语料库/文本中的字词。代码位于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
时获得一些独特的索引值?或者,是否有办法返回在语料库中找到匹配单词的位置?也许还有另一种更好的方法来获得突出显示和导航。感谢您的意见
答案 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