我正在结果页面上创建搜索词的亮点。
这就是我现在使用的:
$resmessage = preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "/iu", '<span class="searchword" >' . $searchword . '</span>', $resmessage );
但是,如果单词是附件上的标题名称,则会破坏布局。
示例文字:
test ok /n[attachment=1]test-2.png[/attachment]
结果:
test ok test-2.png" title="test-2.png" rel="lightbox[imagelink2]"> test-2.png" style="max-height:800px;" alt="" />
所以我想在搜索词之前排除无字符。 这是什么样的正则表达式,我尝试了很多选择。
答案 0 :(得分:2)
您可以使用正则表达式回溯控制动词((*SKIP)(*FAIL)
部分)来完成。
这将允许您匹配不在BBcode内的任何字符串(标签之间或标签名称本身):
$searchword = "test";
$resmessage = "test attachment ok \n[attachment=1]test-2.png[/attachment] test ";
$resmessage .= "[test]test[/test] ok [attachment=1]my-test-2.png[/attachment] test";
$pattern = '/\[.+?\].*?\[\/.+?\](*SKIP)(*FAIL)|' .
preg_quote($searchword, '/') .
"/iu";
$resmessage = preg_replace(
$pattern,
'<span class="searchword">' . $searchword . '</span>',
$resmessage
);
这将返回:
<span class="searchword">test</span> attachment ok
[attachment=1]test-2.png[/attachment] <span class="searchword">test</span>
[test]test[/test] ok [attachment=1]my-test-2.png[/attachment]
<span class="searchword">test</span>
答案 1 :(得分:1)
这应该为你做。 \s
是一个空格(制表符,换行符或空格),+
表示一个或多个空格字符的出现。
<?php
$resmessage = "test ok /n[attachment=1]test-2.png[/attachment]";
$searchword = 'test';
echo preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "\s+/iu", '<span class="searchword" >' . $searchword . '</span>', $resmessage);
输出:
<span class="searchword" >test</span>ok /n[attachment=1]test-2.png[/attachment]
你可以用你想要的任何东西替换它preg_replace的第二个参数就是你想要的。 http://php.net/manual/en/function.preg-replace.php
所以
echo preg_replace ( '/' . preg_quote ( $searchword, '/' ) . "\s+/iu", '[b]' . $searchword . '[/b]', $resmessage);
会给你
[b]test[/b]ok /n[attachment=1]test-2.png[/attachment]