2016-09-05 8 views
4

2時間試していますが、正規表現を正しくマスターできないようです。文字列からすべてのhtmlコメントを置き換えたいのですが、文字列が<br>タグですぐには成功しない場合にのみ、Preg_replace strの直後にstrが続く

I持って次の文字列からすべてのHTMLコメントを削除するには、うまくすでに作業:私はそれがすぐに<br>タグによって成功したら、コメントが交換されないように追加しようとしています

preg_replace('/<!--.*?-->/s', '', $str); 

。私は、この(明らかに間違っている)のようなものを考えていたが、それのまわりで私の頭をラップすることはできません。

preg_replace('/<!--.*?-->(?!<br>)/s', '', $str); 

感謝どれ指導。

+0

あなたが持っているものと達成したいものを投稿してください –

答えて

2

遅延ドットパターンは、次のパターンと一致する最初の部分文字列までできるだけ少ない文字に一致します。つまり、<!--が見つかると、.*?に一致する文字列が次の文字列になります-->と一致するものは<br>であっても、であっても次のコメントの終了コメントの区切りです。

あなたがする必要があるのは、.*?-->と一致しないことを確認することです。 (?:(?!-->).)*tempered greedy token、またはその広げられたバージョンを使用するか:

'~<!--[^-]*(?:-(?!->)[^-]*)*-->(?!<br>)~s' 

[^-]*(?:-(?!->)[^-]*)*パターン-の配列が続いていない0+次いで-以外の任意の0+文字([^-]*)と一致し、regex demo

を見ます->-(?!->)参照)、次に-以外の0以上の文字。

(?:(?!-->).)*焼き貪欲トークンは-->シーケンス((?!-->))、0回以上(*)を起動していない任意の文字(.)と一致します。

+0

私はすべてを理解するとは言えませんが、あなたよりもうまく機能するようです。 – suncat100

+0

ポイントは、 '。*?'は任意のシンボルにマッチするということです。それが問題だ。強化されたgreedyトークンは、 '(?!...)'ネガティブ先読みの中のパターンの開始点ではないテキストにマッチします。その '。*? 'を制限する必要があり、このシナリオでは貪欲な貪欲トークンが問題になります。ループ原理の解説については、http://www.softec.lu/site/RegularExpressions/UnrollingTheLoopを参照してください。 –

関連する問題