preg_replace除了bbcode中的内容之外的所有内容

时间:2012-08-03 17:55:01

标签: php preg-replace bbcode

我正在尝试用空格替换我的内容中的所有内容,除了我的bbcode中的内容(以及bbcode本身)。

这是我的代码,以消除我的bbcode。 BBCode只是识别重要内容的一个小帮手。

$content = preg_replace ( '/\[lang_chooser\](.*?)\[\/lang_chooser\]/is' , '$1' , $content );

是否可以否定此代码?

$content = preg_replace ( '/^[\[lang_chooser\](.*?)\[\/lang_chooser\]]/is' , '' , $content );

干杯&谢谢你的帮助!

修改 这是我的解决方案(对不起,我现在无法回答我自己的问题)

$firstOcc = stripos($content, '[lang_chooser]');
$lastOcc = stripos($content, '[/lang_chooser]');
$content = substr($content, $firstOcc, $lastOcc + strlen('[/lang_chooser]') - $firstOcc);
$content = preg_replace('/' . addcslashes('[lang_chooser](.*?)[/lang_chooser]', '/[]') . '/is', '$1', $content);

我认为这不是最好的解决方案,但它目前正在努力。 也许有更好的方法来做到这一点; - )

1 个答案:

答案 0 :(得分:2)

除了字符类之外,^字符不会否定。它表示匹配字符串的开头(如果您处于多行模式,则为行)。

有可能有负面的前瞻和回顾,但不要否定我认为的整个正则表达式。

如果您只想用字符串的一部分替换字符串,请使用preg_match并将matches数组分配给您的文本

if( preg_match ( '/(\[lang_chooser\].*?\[\/lang_chooser\])/is', $content, $matches ) )

    echo $matches[ 0 ]; // should have what you want

为了便于阅读,我使用addcslashes来转义/和[:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/is', $content, $matches ) )

addcslashes的最佳部分是你可以使用任何正则表达式(来自变量,来自搜索框的值,来自config)并安全地调用preg函数而不必担心要使用的分隔符。

除非出于某种奇怪的原因你不使用utf-8,否则你可能还需要u修饰符来实现unicode:

if( preg_match ( '/' . addcslashes( '([lang_chooser].*?[/lang_chooser])', '/[]' ) . '/isu', $content, $matches ) )

与此同时,我对addslashes方法进行了一些改进。它允许在正则表达式中使用字符串文字,而不必担心元字符。 Xeoncross指出了preg_quote。拥有这样的转义类可能仍然很好,所以你可以从某个地方采用一个固定的分隔符来保持你的代码更整洁。此外,您可能希望在某些时候添加其他正则表达式,或者能够在不更改其余代码库的情况下捕获对preg_quote的未来更改。目前只支持pcre:

class Escape
{
    /*
     * escapes meta characters in strings in order to put them in regular expressions
     * 
     * usage:
     * pcre_replace( '/' . Escape::pcre( $text ) . '/u', $string );
     * 
     */

    static
    function pcre( $string )
    {
        return

            preg_quote( $string, '/' )

        ;
    }
}