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 を使用して、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 の最良の部分は、(変数から、検索ボックスの値から、構成から) 任意の正規表現を使用して、どの区切り文字を使用するかを気にせずに preg 関数を安全に呼び出すことができることです。

何らかの奇妙な理由で utf-8 を使用しない場合を除き、おそらく Unicode 準拠のために u 修飾子も必要です。

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, '/' )

        ;
    }
}
于 2012-08-03T17:59:26.633 に答える