1

我正在尝试用空白空间替换我的内容中的所有内容,除了我的 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);

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

4

1 回答 1

2

除了在字符类中,^ 字符不取反。这意味着匹配字符串的开头(如果您处于多行模式,则匹配该行)。

可以有否定的前瞻和后视,但不能否定我认为的整个正则表达式。

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

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 最好的部分是您可以获取任何正则表达式(来自变量、来自搜索框值、来自配置)并安全地调用 preg 函数,而无需担心使用什么分隔符。

您可能还需要 u 修饰符以符合 unicode 规范,除非出于某种奇怪的原因您不使用 utf-8:

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

同时,我稍微改进了 addlashes 方法。它允许在正则表达式中使用字符串文字,而不必担心元字符。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, '/' )

        ;
    }
}
于 2012-08-03T17:59:26.633 回答