1. ホーム
  2. html

[解決済み] 正規表現パターンが文字列のどこにもマッチしない場合の対処法とは?

2022-05-01 09:36:06

質問

をマッチングさせようとしています。 <input> タイプの "hidden "フィールドを、このパターンを使って作成します。

/<input type="hidden" name="([^"]*?)" value="([^"]*?)" />/

サンプルフォームデータです。

<input type="hidden" name="SaveRequired" value="False" /><input type="hidden" name="__VIEWSTATE1" value="1H4sIAAtzrkX7QfL5VEGj6nGi+nP" /><input type="hidden" name="__VIEWSTATE2" value="0351118MK" /><input type="hidden" name="__VIEWSTATE3" value="ZVVV91yjY" /><input type="hidden" name="__VIEWSTATE0" value="3" /><input type="hidden" name="__VIEWSTATE" value="" /><input type="hidden" name="__VIEWSTATE" value="" />

しかし、私は、その type , name および value 属性は常に同じ順序で表示されます。もし type 属性が最後に来ると、マッチは失敗します。私のパターンでは、それは先頭にあるからです。

質問です。

の属性の位置に関係なくマッチするように、パターンを変更するにはどうすればよいですか? <input> タグを使用できますか?

追伸 ちなみに、私が使っているのは アドビエアー ベース RegExデスクトップツール 正規表現のテストに使用します。

どのように解決するのですか?

ここでのすべての回答とは逆に、あなたがやろうとしていることについては、正規表現は完全に有効な解決策です。なぜなら、あなたはバランスの取れたタグをマッチさせようとしているわけではないからです。しかし、あなたは1つのタグにあるものだけをマッチさせているのであり、それは完全に正規のものです。

しかし、ここで問題が発生します。1つの正規表現だけではできません...1つのマッチで <input> タグを作成し、そのタグに対してさらに処理を行います。なお、この処理は、属性値のどれにも > 文字が含まれているため、完璧ではありませんが、まともな入力には十分でしょう。

以下、Perlの(疑似)コードで説明します。

my $html = readLargeInputFile();

my @input_tags = $html =~ m/
    (
        <input                      # Starts with "<input"
        (?=[^>]*?type="hidden")     # Use lookahead to make sure that type="hidden"
        [^>]+                       # Grab the rest of the tag...
        \/>                         # ...except for the />, which is grabbed here
    )/xgm;

# Now each member of @input_tags is something like <input type="hidden" name="SaveRequired" value="False" />

foreach my $input_tag (@input_tags)
{
  my $hash_ref = {};
  # Now extract each of the fields one at a time.

  ($hash_ref->{"name"}) = $input_tag =~ /name="([^"]*)"/;
  ($hash_ref->{"value"}) = $input_tag =~ /value="([^"]*)"/;

  # Put $hash_ref in a list or something, or otherwise process it
}

基本的な原則は、1つの正規表現で多くのことをやろうとしないことです。お気づきのように、正規表現ではある程度の順序が強制されます。ですから、その代わりに必要なことは、まず抽出しようとするものの文脈にマッチし、次に必要なデータに対してサブマッチを行うことです。

EDITです。 しかし、一般的にはHTMLパーサーを使う方が簡単で良いということには同意しますし、コードの再設計や目的の再検討を本当に検討すべきです :-) 。しかし、HTMLのどのサブセットもパースすることは不可能だという膝を打つ反応に対抗するために、この回答を投稿する必要があったのです。HTMLもXMLも仕様全体を考えると不規則ですが、タグの仕様はきちんと規則性があり、PCREの力の及ぶ範囲内であることは確かです。