正则表达式preg_replace在bbcode时中断

时间:2015-06-15 23:33:37

标签: php regex preg-replace bbcode

我正在结果页面上创建搜索词的亮点。

这就是我现在使用的:

$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="" />

所以我想在搜索词之前排除无字符。 这是什么样的正则表达式,我尝试了很多选择。

2 个答案:

答案 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]
相关问题