0

以下の $string と同様のパターンを持つ文字列があります (フォーラムの投稿から取得)。

$string = "[quote=\"abc123\":27zslwh3]I don't agree with most of the statements made here.[/quote:27zslwh3] I don't think that is very nice of you.";
$pattern = "/\[quote\=.\*\[\/quote.*\]/";
$replace = "";

$updated_text = preg_replace($pattern,$replace,$string);
echo $updated_text;

preg_replace を使用して、[引用符] の開始タグと終了タグの間のすべてのテキストを削除し、残りの文字列をエコーし​​ようとしています。のみ (上記の $string から)。

正規表現に使用しているパターンは、開始 [引用] タグの先頭を探し、終了 [引用] タグとタグの最後の ] が見つかるまで検索することになっています。

ただし、上記は適切に機能していないようです。また、reg 式にあまり精通していないため、ここで立ち往生しています。どんな助けでも大歓迎です。

.

注: draw010bsdnoobzによって提供された両方のコードを試しました (コードと説明に感謝します) が、それでも機能しませんでした。問題は、$string テキストを正しくキャプチャしなかったことです。次のように読む必要があります。

$string = '[quote="abc123":27zslwh3]I dont agree with most of the statements made here.

abc123[/quote:27zslwh3]
I dont think that is very nice of you.';

二重引用符には html 文字があり、改行文字または改行文字のように見えるものもあり、これがおそらく、以下に提出された正規表現が機能しない原因です。

4

2 に答える 2

2
$string = '[quote="abc123":27zslwh3]I don\'t agree with most of the statements made here.[/quote:27zslwh3] I don\'t think that is very nice of you.';
echo preg_replace('/\[quote.+?\].+?\[\/quote.+?\]/is', '',$string);
// will print: I don't think that is very nice of you.

注:入力文字列には、一重引用符と二重引用符の両方があります。この例では、入力文字列を一重引用符で囲み、文字列内の一重引用符をエスケープします。

于 2012-05-31T05:07:34.173 に答える
2

これも機能するパターンです:

$pattern = '/\[quote[^\]]*\].*?\[\/quote[^\]]*\]/is';

あなたが持っているようなフォーマット、または単に引用符のようなものに一致します[quote]Text...[/quote]

それを分解するには:

\[quote[^\]]*\]テキストと、 0 回以上 を除く[quote任意の文字に一致すると言います ]

\]]開始[quote]タグ の最後の終了に一致します。

.*?任意の文字に 0 回以上一致します。この?コンテキストの は、この一致を非貪欲にします (つまり、パターンの最後ではなく、最初に次の部分に一致したときに停止します。

\[\/quote[^\]]*\]次に、および 0 回以上を除く[/quote任意の文字に一致し、最後にクロージングを消費します ]]

于 2012-05-31T05:09:10.073 に答える