2012-05-04 14 views
0

PHPでは、以下の両方のテンプレート参照と一致する正規表現を取得しようとしています。問題は、テキストの最初のブロックから</ul>を取得することです。 /sフラグを削除すると、2番目の参照のみがキャッチされます。私は間違っているの?テンプレートキャプチャの正規表現があまりにも多い

/{{\%USERS}}(.*)?{{\%\/USERS}}/s 

ここは私の文字列です。

<ul class="users"> 
{{%USERS}} 
<li>{%}</li> 
{{%/USERS}} 
</ul> 

{{%USERS}} hello?!{{%/USERS}} 

私の表現があまりにも多すぎる、または小さすぎるのはなぜですか?あなたはおそらく、非欲張り数量を使用する必要が

/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g 

答えて

1

なぜ私の表現はあまりにも少なすぎるのですか?

  1. その数量は、デフォルトで貪欲であるため、あまり引く

  2. (そのためのリチウムアウン・イップの解答1を参照してください)あなたはそれが唯一の2回目の出現に一致する修飾子sを削除した場合、この修飾子は改行文字にも一致するようにしているため、最初の部分との間に改行があるため、最初の部分と一致することはできません。

は非欲張り答え

{{\%USERS}}(.*?){{\%\/USERS}} 

here on Regexr、正規表現をテストするのに適した場所を参照してください。

Btw。 *も空の文字列と一致するので、捕捉グループの後に?を削除しました。その必要はありません。したがって、オプションで追加する必要はありません。

+0

私は正規表現が欲張りであったことを知らなかった、知っておいてよかった!私はそれを試みたが、それはうまくいかなかったが、私はそれがドットの旗を含んでいなかったからだと思うと私は思った。 – Rezen

0

はここにあなたの正規表現です。

*および+は「貪欲」です。できるだけ多くの文字に一致します。

*?および+?は「非貪欲」である。正規表現の次の部分に移動するのに必要な文字数だけ一致します。

したがって、次のテスト文字列に:

<alpha><bravo> 
  • <.+><alpha><bravo>(!ほか として.マッチ><ので)をキャプチャします。
  • <.+?>は、<alpha>をキャプチャします。
+0

[それは動作します](http://regexr.com?30riu)、実際には*なぜ*動作するのか説明する必要があります。 (また、 '{{%USERS}} {asdf} {{%/ USERS}}' {{%USERS}} {{%/ USERS}} ')のために壊れます。 –

+0

私は文字列著者によって提供されます。文字列の内容に関するコメントはありません –

+0

確かに有能なプログラマーとして、常に防衛的にコードを書くのは義務です。 ;) –

2

関連する問題