1

それは非常に単純です、私は以下が一致する理由を理解していません:

preg_match('/\<td valign="top" class="bericht"\>(.*\s)*<\/td>/',$html,$matches3);

そして、これはしません:

preg_match('/\<td valign="top" class="bericht"\>(.*(\s)?)*<\/td>/',$html,$matches3);

思った?ゼロまたは1を意味しました。だから私はそれがどのように何かを一致させないことができるのかわかりません。

RegexPal(http://regexpal.com/)でテストすると、すべてが期待どおりに機能します。したがって、2番目のものは一致します。

4

2 に答える 2

2

ティム・ピーツカーの言うことに加えて。. .

2番目のものが一致しないとどのように判断していますか? 最初のパターンは$matches3[1]table-cell の内容に設定されますが、2 番目のパターンは常に$matches3[1]空の文字列に設定されることに注意してください。

次のようになっているとし$htmlます。

<td valign="top" class="bericht">yes </td>

次に、(.*\s)*最初のパターンの が一致し、その後はyes 何も一致しないため、 に保存yes され$matches3[1]ます。

しかし、(.*(\s)?)*2 番目のパターンの が一致yes し、その後に空の文字列が一致するため、空の文字列が に格納され$matches3[1]ます。

あなたが何をしようとしているのか正確にはわかりませんが、目標が と の間のすべてをキャプチャすることだけである場合は<td valign="top" class="bericht"></td>それが何であるかに関係なく、次のように書く必要があります。

preg_match('/\<td valign="top" class="bericht"\>(.*?)<\/td>/s',$html,$matches3);

(ここで、*?は「ゼロ回以上、できればできるだけ少ない」という意味であり、は「改行を含む任意の文字に一致することを/s許可する」という意味です)。.

于 2012-06-22T14:46:50.040 に答える
1

これらの両方が一致する必要があります。しかし、2 つ目は壊滅的なバックトラッキングに遭遇する可能性があります。

  • .も一致\sします (キッカー、改行を除く)
  • ネストされた無限量指定子を使用します (本質的には、オプションである(.*)*ため\sです) 。

したがって、十分な改行を含む十分に大きな入力が与えられた場合、PHP はバックトラックの特定のしきい値を超えるとマッチングを停止します (これはどこかで設定できますが、どこで設定したかは忘れました) 一方、オンラインの正規表現テスターは先に進み、考えられるすべての順列を使い果たす可能性があります。

于 2012-06-22T14:42:05.197 に答える