1

{{と}}の間のすべてに一致する必要があるreg式のパターン

ウィキペディアを解析しようとしていますが、rexexコードを実行した後、孤立した}}になってしまいます。これが私のPHPスクリプトです。

<?php

$articleName='england';

$url = "http://en.wikipedia.org/wiki/Special:Export/" . $articleName;
ini_set('user_agent','custom agent'); //required so that Wikipedia allows our request.

$feed = file_get_contents($url);
$xml = new SimpleXmlElement($feed);

$wikicode = $xml->page->revision->text;



$wikicode=str_replace("[[", "", $wikicode);
$wikicode=str_replace("]]", "", $wikicode);
$wikicode=preg_replace('/\{\{([^}]*(?:\}[^}]+)*)\}\}/','',$wikicode);

print($wikicode);

?>

問題は、{{と}}をネストしたことだと思います。例:

{{何か{{何か他の{{何か新しい}}{{何か古い}}何か青い}}何か緑}}

4

5 に答える 5

4

次を使用できます。

\{\{(.*?)\}\}

ほとんどの正規表現フレーバーは、ここでは当てはまらない{ような繰り返し演算子の一部でない限り、中括弧をリテラル文字として扱います。{x,y}したがって、バックスラッシュでエスケープする必要はありませんが、エスケープしても同じ結果が得られます。

したがって、次のものも使用できます。

{{(.*?)}}

サンプル:

$ echo {{StackOverflow}} | perl -pe 's/{{(.*?)}}/$1/'
StackOverflow

.*また、 (改行以外の)任意の文字に一致するものがここでは貪欲でない方法で使用されていることに注意してください。そのため、可能な限り一致させようとします。

例:

文字列'{{stack}}{{overflow}}'では一致'stack'しますが、一致しません'stack}}{{overflow'
後の動作が必要な場合は、に変更.*?.*て、試合を貪欲にすることができます。

于 2010-10-14T11:54:44.980 に答える
2

あなたの編集は、再帰的な一致を試みていることを示しています。これは、元の質問とは大きく異なります。一致したテキストを削除するだけではない場合は、正規表現をまったく使用しないことをお勧めしますが、これはあなたが望むことをするはずです:

$wikicode=preg_replace('~{{(?:(?:(?!{{|}}).)++|(?R))*+}}~s',
                       '', $wikicode);

最初の区切り文字が最初{{の区切り文字に一致した後、(?:(?!{{|}}).)++次の区切り文字まですべてを飲み込みます。それが別の開始区切り文字である場合、(?R)は引き継ぎ、正規表現全体を再び再帰的に適用します。

(?R)正規表現機能が取得するのと同じくらい非標準です。これは、PHP の正規表現フレーバーを強化する PCRE ライブラリに固有のものです。他のいくつかのフレーバーには、再帰構造を一致させる独自の方法があり、それらはすべて互いに非常に異なります。

于 2010-10-14T18:38:09.323 に答える
0

\{{2}(.*)\}{2}または、よりクリーンで、ルックアラウンド(?<=\{{2}).*(?=\}{2})がありますが、正規表現エンジンがそれらをサポートしている場合に限ります。

}}最初に見つかった(つまり欲張りでない)ところで試合を停止したい場合は、に置き換える必要が.*あり.*?ます。

.また、一部のエンジンではデフォルトで改行文字と一致しないため、エンジンの1行一致の設定を考慮する必要があります。単一行を有効にするか、[.\r\n]*の代わりに使用できます.*

于 2010-10-14T12:00:16.600 に答える
0

すでに述べた貪欲でない量指定子を使用する以外に、これを使用することもできます。

\{\{(([^}]|}[^}])*)}}

内側([^}]|}[^}])*は、シーケンスを含まない 0 個以上の任意の文字のシーケンスにのみ一致するために使用されます}}

于 2010-10-14T12:10:19.333 に答える
0

最短一致を得るための貪欲なバージョンは

\{\{([^}]*(?:\}[^}]+)*)\}\}

(比較のために、 stringを使用{{fd}sdfd}sf}x{dsf}}すると、遅延バージョン\{\{(.*?)\}\}は照合に 57 ステップかかりますが、私のバージョンは 17 ステップしかかかりません。これは、Regex Buddy のデバッグ出力が信頼できることを前提としています。)

于 2010-10-14T12:10:22.813 に答える