3

OK、この正規表現が機能する理由を徹底的に理解しています。私が取り組んでいるテキストはこれです:

<html>
  <body>
    hello
    <img src="withalt" alt="hi"/>asdf
    <img src="noalt" />fdsa<a href="asdf">asdf</a>
    <img src="withalt2" alt="blah" />
  </body>
</html>

次の正規表現を使用すると (php でテストされていますが、すべての perl 正規表現に当てはまると想定しています)、alt タグを含まないすべての img タグが返されます。

/<img(?:(?!alt=).)*?>/
Returns:
<img src="noalt" />

それに基づいて、後方参照を削除するだけで同じものが返されると思います。

/<img(?!alt=).*?>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />
<img src="withalt2" alt="blah" />

ご覧のとおり、すべてのイメージ タグを返すだけです。さらに混乱させるために、? を削除します。(私が知る限り、単にワイルドカードです) * が最後まで戻った後 >

/<img(?!alt=).*>/
Returns:
<img src="withalt" alt="hi"/>
<img src="noalt" />fdsa<a href="asdf">asdf</a>
<img src="withalt2" alt="blah" />

誰かが私に知らせてくれるか、少なくともここで何が起こっているかについて正しい方向に向けてくれますか?

4

1 に答える 1

2
/<img(?:(?!alt=).)*?>/

この正規表現は、 の後に一致する各文字に否定先読みimgを適用します。そのため、 が見つかるとすぐalt=に停止します。したがって、属性imgを持たないタグにのみ一致します。alt

/<img(?!alt=).*?>/

この正規表現は、 の後に否定先読みをimg適用するだけです。そのため、文字列のさらに下に表示されるかどうかに関係なく、が続いていない>すべてのタグの最初までのすべてに一致します。でカバーされます。imgalt=alt=.*?

/<img(?!alt=).*>/

>これは前のものと同じですが、 を使用しているため、最後の まで一致しますgreedy matching。しかし、なぜその出力を得たのかわかりません。の最後まですべて揃っているはず>です</html>


そこで起こったことをすべて忘れて、 anHTML Parserを解析するために an に向かって移動しますHTML。これらは、このタスク用に特別に設計されています。したがって、わざわざ正規表現を使用しないでください。正規表現を使用してすべての種類の HTML を解析することはできないからです。

于 2013-02-14T21:56:09.947 に答える