动态地将文本插入字符串(PHP)

时间:2013-03-15 16:34:26

标签: php regex search-engine

我有一个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>),然后在单词后面直接插入文本({{1}在这个例子中)同时保留单词本身不被替换。我相信这个规则</b>preg_replace,所以我真的很想做什么。

任何线索都会非常感激。

4 个答案:

答案 0 :(得分: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 在这种情况下,我不区分大小写

(括号)中的任何内容都会被捕获以供以后使用,可以在$ match参数中使用,也可以替换为$ 1,或者在第一个$ 2秒内使用\\ 1,等等。

答案 1 :(得分:1)

使用preg_replace。在你的例子中

$result = preg_replace("/\\b(" . preg_quote($word) . ")\\b/i", '<b>$1</b>', $result);

答案 2 :(得分:0)

您可以使用preg_replace:

foreach ($exploded as $word) {
    $text = preg_replace("`(" . preg_quote($word) . ")`Ui" , "<b>$1</b>" , $text);
}

答案 3 :(得分: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);

快速的棕色狐狸跳过懒狗