0

我有一个 PHP 脚本,它根据放入网站搜索框中的术语在我的数据库上运行搜索。这将返回一个文本块。假设我现在的搜索词是"test block"。我的结果的一个例子是这个文本块:

这是使用搜索查询从数据库中收集的文本测试块。

现在,我的问题是:如何在文本块中“突出显示”搜索词,以便用户可以看到为什么首先拉出这个结果。使用上面的示例,类似以下内容就足够了:

这是通过搜索查询从数据库中收集的文本测试块。

到目前为止,我已经尝试了一些可以更改文本的方法,但我遇到的真正问题与区分大小写有关。例如,如果我使用以下代码:

$exploded = explode(' ', $search_terms);
foreach($exploded as $word) {
    // I have to use str_ireplace so the word is actually found
    $result = str_ireplace($word, '<b>' . $word . '</b>', $result);
}

它会通过我$resultbold任何单词的实例。这看起来是正确的,正如我在搜索结果的第二个示例中所希望的那样。但是,在用户使用"Test Block"而不是 的情况下"test block",搜索词将大写并显示为:

这是通过搜索查询从数据库中收集的文本测试块。

这对我不起作用,尤其是当用户使用小写搜索词并且它们恰好落在句子的开头时。

本质上,我需要做的是在字符串中找到单词,<b>直接在单词前面插入文本(在本例中),然后在单词后直接插入文本(</b>在本例中),同时保留单词本身不被替换. 我相信这个规则preg_replacestr_replace所以我真的被困在做什么上。

任何线索将不胜感激。

4

4 回答 4

2
$exploded = explode(' ', $search_terms);
foreach($exploded as $word) {
    // I have to use str_ireplace so the word is actually found
    $result = preg_replace("/(".preg_quote($word).")/i", "<b>$1</b>", $result);
}

模式匹配http://www.php.net/manual/en/reference.pcre.pattern.syntax.php使用某些字符,如 . [ ] / * + 等.. 所以如果这些出现在模式中,它们需要首先转义pre_quote();

模式以分隔符开始和结束以识别模式http://www.php.net/manual/en/regexp.reference.delimiters.php

跟着我的修饰符http://www.php.net/manual/en/reference.pcre.pattern.modifiers.php 在这种情况下,我表示不区分大小写

(括号)中的任何内容都将被捕获以供以后使用,无论是在 $matched 参数中还是在替换中作为 $1 或 \\1 用于第一个,$2 第二个等。

于 2013-03-15T16:43:12.613 回答
1

使用preg_replace. 在你的例子中

$result = preg_replace("/\\b(" . preg_quote($word) . ")\\b/i", '<b>$1</b>', $result);
于 2013-03-15T16:42:59.820 回答
0

您可以使用 preg_replace:

foreach ($exploded as $word) {
    $text = preg_replace("`(" . preg_quote($word) . ")`Ui" , "<b>$1</b>" , $text);
}
于 2013-03-15T16:42:39.767 回答
0
$string = 'The quick brown fox jumped over the lazy dog.';
$search = "brown";
$pattern = "/".$search."/";
$replacement = "<strong>".$search."</strong>";
echo preg_replace($pattern, $replacement, $string);

敏捷的棕色狐狸跳过了懒惰的狗

于 2013-03-15T16:45:13.117 回答