2011-10-30 107 views
0

我正在使用preg_replace在我的网站上创建搜索内容的片段,并突出显示搜索到的术语(如google)。它在我的页面上使用静态变量时有效,但是当我从数据库中检索数据时,它不会。代码如下:Preg_replace动态内容?

foreach ($searchcontent ->result() as $row) 
{ 
$text = $row->content; 
$keyword = 'investment'; 
$size = 165; 

$snippet = preg_replace(
    '/^.*?\s(.{0,'.$size.'})(\b'.$keyword.'\b)(.{0,'.$size.'})\s.*?$/', 
    '...$1<strong>$2</strong>$3...', 
    $text 
); 
echo $snippet; 

    } 

如果我改变了一些静态的内容,如$文本变量: "We are happy to consultant on your investments"它的工作原理。但是,当我从数据库中获取数据时,它不会。

从数据库中的文本样本(包含HTML,可能是问题),

<h2>Investments<h2> 
<hr /> 
<p>We are happy to consult on your investments</p> 

一个人怎么会去剥离HTML标签的字符串?并得到preg_replace工作????

+0

当然这是问题所在。数据库是否每次都返回相同的html?或者它可以改变? – FailedDev

+0

或多或少有相同的格式,但可能会有所不同 – hairynuggets

+1

只要你处理纯html,我认为'str_replace()'就足够了。无论如何,提到的“正则表达式”表达式似乎与其主题相比过于复杂。 – yoda

回答

1

这工作:http://codepad.org/Ve1dhj8q

但是,它会更好,如果你贴上一个真正的数据库的结果,因为这个问题可能会出现。

编辑

这是你想要的。您可以使用preg_match()来捕获($matches[1])之前和($matches[2])之后的内容,并且不要忘记检查是否找到任何匹配项(使用count())。剩下的只是添加以前发布的代码,以突出显示这些单词。 $limit是偏移量。

$text = 'Lorem ipsum dolor sit amet, consectetur adipiscing elit. Praesent consectetur tempor egestas. Nam arcu augue, bibendum sed pulvinar at, posuere ut massa. Duis tristique suscipit rutrum. Curabitur eu est sed sem consequat consequat ut sed erat. Aliquam ac eros est. Nulla posuere dolor eu arcu tempus suscipit auctor velit condimentum. Class aptent taciti sociosqu ad litora torquent per conubia nostra, per inceptos himenaeos. Maecenas sollicitudin diam ut neque laoreet vitae placerat tortor commodo. Aliquam vehicula aliquet arcu non molestie. Sed adipiscing faucibus faucibus. In eget velit non elit ullamcorper consequat.'; 

$limit = 50; 
$keyword = 'tempus'; 


preg_match('/(.{0,'.$limit.'})'.$keyword.'(.{0,'.$limit.'})/', $text, $matches); 

echo var_dump($matches); 

示例输出

array(3) 
{ 
    [0]=> string(106) " Aliquam ac eros est. Nulla posuere dolor eu arcu tempus suscipit auctor velit condimentum. Class aptent t" 

    [1]=> string(50) " Aliquam ac eros est. Nulla posuere dolor eu arcu " 

    [2]=> string(50) " suscipit auctor velit condimentum. Class aptent t" 
} 

奖金

如果你对设计/标记目的需要限制短语,可以说100个字(例如,如果你的DIV容器只能采取一定数量的字符为了保持布局平衡),你可以这样做:

$limit = 0; 
$total = 100; 
$keyword = 'yumm'; 

$limit = (int) ($total - strlen($keyword))/2); 
+0

我是否需要动态内容的输出缓冲? – hairynuggets

+0

不是在这种情况下,没有。你可以使用它,这取决于你想要完成什么。 – yoda

+0

使用您粘贴的代码,我怎样才能限制突出显示的关键字周围的文字?这很重要,因为文字很长。 – hairynuggets

0

您可以使用PHP的strip_tags()函数。

$text = strip_tags($row->content); 
+0

嗨克莱夫,我已经剥离了标签的文本,但preg_replace仍然不会在数据库中的内容上运行。有任何想法吗??? – hairynuggets