0
<!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/1.png|-->
<img src="some_url.com/uploads/posts/2012-12/1.png" alt="***" title="***"  />
<!--dle_image_end--> bla bla bla bla <!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/2.png|-->
<img src="some_url.com/uploads/posts/2012-12/2.png" alt="***" title="***"  />
<!--dle_image_end--> bla bla bla <!--dle_image_begin:http://some_url.com/uploads/posts/2012-12/3.png|-->
<img src="some_url.com/uploads/posts/2012-12/3.png" alt="***" title="***"  />
<!--dle_image_end-->

上記の例から取得する必要^<!--dle_image_begin:(.*)|-->$がありますが、すべての文字列が返されます。

4

2 に答える 2

1

.もマッチ|します。したがって、正規表現は検索するために最後の位置に移動します|-->。これは貪欲と呼ばれます。非常によくある間違いで、ここ SO でよく聞かれます。

それに対処する簡単な方法として:

^<!--dle_image_begin:([^|]*)\|-->
                      ^^^^  ^    ^
                        |   |    |
           negative class   |    |
                  escape pipe    |
                    dollar is gone

負の文字クラス: すべてが|一致します。|-->そのため、代わりに最初に見つかった時点で停止します。正規表現は独自の言語であるため、PHP の次に学習する必要があります。独自のルールに従います。練習は完璧を作る。

于 2013-01-05T22:59:33.250 に答える
0

これはあなたが望むパスと一致します

(?<=<!--dle_image_begin:)((?:(?!\|-->).)*)(?=|-->)

最初と最後の部分 ( (?<=<!--dle_image_begin:)& (?=|-->)) は、前後の文字列をチェックするためのいわゆる「ルックアラウンド」です。

詳細については、こちらを参照してください: http://www.regex101.com/r/iS8lE5

于 2013-01-05T23:04:35.267 に答える