0

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

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

これが私の文字列です。

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

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

なぜ私の表現が多すぎたり少なすぎたりするのですか?

4

3 に答える 3

2

おそらく、欲張りでない数量詞を使用する必要があります。

*そして+「貪欲」です。できるだけ多くの文字に一致します。

*?+?「貪欲ではない」です。それらは、正規表現の次の部分に進むために必要な数の文字にのみ一致します。

したがって、次のテスト文字列では次のようになります。

<alpha><bravo>
  • <.+>キャプチャします<alpha><bravo>.一致するため><です!)。
  • <.+?>キャプチャし<alpha>ます。
于 2012-05-04T05:39:18.043 に答える
1

なぜ私の表現が多すぎたり少なすぎたりするのですか?

  1. 数量詞はデフォルトで貪欲であるため、キャッチが多すぎます(これについては、Li-aung Yipの回答+1を参照してください)。

  2. 修飾子を削除するsと、2番目のオカレンスにのみ一致します。これは、その修飾子によって.改行文字も一致するためです。これがないと、間に改行があるため、最初の部分と一致することはできません。

貪欲でない答えを見る

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

ここRegexrで、正規表現をテストするのに適した場所です。

ところで。空の文字列にも一致?するため、キャプチャグループの後を削除しました。これは不要であり、追加でオプションにする必要はありません。*

于 2012-05-04T06:27:21.733 に答える
0

これがあなたの正規表現です:

/{{%USERS}}([^{]+({%[^{]+)?){{%/USERS}}/g
于 2012-05-04T05:32:27.937 に答える