2013-03-15 110 views
0

我有一个PHP脚本,根据放置在网站搜索框中的术语在我的数据库上运行搜索。这会返回一段文字。假设我现在的搜索字词是"test block"。我的结果的一个例子是这段文字:动态插入文本到字符串(PHP)

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

现在,我的问题是:我怎么能“亮点”的文本块内的搜索项,使用户可以看到为什么这个结果首先拉动。使用上面的例子,像下面这样就足够了:

这是文本试块这是从数据库中 聚集来自搜索查询。

我已经尝试了一些东西到目前为止将改变文本,但我遇到的真正问题必须与区分大小写。例如,如果我使用的代码:

$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,所以我真的坚持要做什么。

任何线索将不胜感激。

+0

您可以使用preg_replace()与替换部分中的$ 1代表匹配的参数。 http://php.net/manual/en/function.preg-replace.php查看来自anyvie的评论devlibre dot fr – Waygood 2013-03-15 16:40:40

+0

@Waygood谢谢你,指出我正确的方向。我猜我只是不明白'preg_quote()'足够的任何一个。 – burmat 2013-03-15 16:55:29

回答

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 在这种情况下,我不区分大小写

稍后会捕获(括号内)任何内容,以$匹配的参数或替换为$ 1或\\ 1为第一个,$ 2秒等。

+0

这有效,但我真的不知道如何。任何方式,你可以把它分解为外行人对我的条款? – burmat 2013-03-15 16:49:15

+0

为简单起见接受 – burmat 2013-03-15 17:02:50

0

可以使用的preg_replace:

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

使用preg_replace。在您的例子

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

这可行,但不适用于某个原因在句子中的第一个单词。 – burmat 2013-03-15 16:50:47

+0

抱歉,第三个参数当然必须是“$ result”,而不是“$字”。此外,“i”修饰符应该包含在模式中: $ result = preg_replace(“/ \\ b(”。preg_quote($ word)。“)\\ b/i”,'$ 1', $结果); – 2013-03-15 16:56:26

+0

您的更正工作。谢谢 – burmat 2013-03-15 17:03:47

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); 

快速棕色狐狸跳过懒狗

+0

如果$ search =“br(。*)拥有”; ? – Waygood 2013-03-15 16:45:53

+0

所以改变模式。总是自作聪明。 :) – karmafunk 2013-03-15 16:50:07

+1

我们生活在一个陌生的世界,当聪明是一种侮辱LOL – Waygood 2013-03-15 16:56:35

相关问题