[解決済み] 正規表現パターンが文字列のどこにもマッチしない場合の対処法とは?
質問
をマッチングさせようとしています。
<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の力の及ぶ範囲内であることは確かです。
関連
-
[解決済み] 最初のマッチで停止する正規表現
-
[解決済み] 正規表現で変数を使うには?
-
[解決済み] 単語を含まない行にマッチする正規表現
-
[解決済み] 正規表現における非捕捉グループとは何ですか?
-
[解決済み] JavaScriptの正規表現でマッチしたグループにアクセスするにはどうすればよいですか?
-
[解決済み] スクロールバーを隠すが、スクロールはできる状態
-
[解決済み] 有効な正規表現を検出するための正規表現はありますか?
-
[解決済み] CSS 背景の不透明度 [重複]について
-
[解決済み] テーブル内のテキストアラインクラス
-
[解決済み] label要素の中にinput要素を入れるべきですか?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
Uncaught TypeError: document.getElementsById は関数ではありません。
-
[解決済み] 横型リストアイテム
-
[解決済み] CSSでテキストや画像の背景を透明にするには?
-
[解決済み] クリック可能なラベルを持つチェックボックスを作成するには?
-
[解決済み] Bootstrap3による垂直方向の整列
-
[解決済み] input type="date "のフォーマットを変更する方法はありますか?
-
[解決済み] 静的な HTML ページにファビコンを追加する
-
[解決済み] CSS背景のストレッチとスケール
-
[解決済み] MIME-typeが原因でスタイルシートが読み込まれない
-
[解決済み] div内の画像の下に余分なスペースがある