2017-06-30 6 views
2

私はDrupal用の正規表現ベースのフィルタを開発しています。これは正規表現/[asciidoc]((.|\n)*)\[\/asciidoc]です。テキストに複数回現れた場合、[asciidoc]と[/ asciidoc]のすべてのインスタンスは、最初と最後のインスタンスと一致します。どのようにしてこの正規表現を定式化して、ネストまたは非貪欲なマッチングを避けることができますか?

例えば、コードに

[asciidoc] here is some text to be filtered[/asciidoc] 
a bit of text 
[asciidoc]some text in a second block[/asciidoc] 
here is some text to be filtered

some text in a second blockようなコードの断片は、フィルタによって処理されることになっているが、

here is some text to be filtered[/asciidoc] 
a bit of text 
[asciidoc]some text in a second block 

は、最初と最後のブロック・マーカー間で一致されます。私がregex101でテストすると、正規表現ではブロック内のコードがgreedyのように一致するので、このブロックは必要なブロックのネストを許可しないnon-greedy正規表現です。

正しい正規表現は何ですか?私は、正規表現の用語に精通していないので、誤っていくつかの用語を使用している可能性があります。

+0

この '(。| \ n)は任意の文字に一致しますが、この' * 'は貪欲な量指定子です。後ろに疑問符「?」を付けることで、すべての量的限定子を非貪欲にすることができます。欲張りでないバージョンであっても、[asciidoc]はフィルタリングされるテキストです。[asciidoc] 少しのテキスト [asciidoc] 2番目のブロックのテキスト[/ asciidoc] '[/ asciidoc ] [/ asciidoc] "だから、正規表現を貪欲に責めないでください。 – sln

答えて

1

この正規表現はDOTALLフラグと怠惰な数量詞で動作するはずです:あなたは(JavaScriptのような)DOTALLフラグのサポートなしで正規表現の区切り文字として/を使用したい場合は

$re = '~\[asciidoc](.*?)\[/asciidoc]~s' 

RegEx Demo

その後、使用します。

/\[asciidoc]([\s\S]*?)\[\/asciidoc]/ 
+0

'preg_match($ re、$ foo、$ matches、PREG_OFFSET_CAPTURE);'のようなコードを試してみると、最初の一致、つまりここで ''フィルタリングされるテキストがあります ''が配列に取り込まれます。 2番目の「2番目のブロックのテキスト」はありません。何が問題なの? – vfclists

+1

'preg_match_all'を使ってすべてのマッチを取得します。 – anubhava

関連する問題