###前提・実現したいこと
一つのマッチの中に複数のサブマッチがある場合、別々のマッチとして受け取って処理したいです。
(もしかしたら、マッチ、サブマッチという用語が適切でないかもしれませんが)
例えば、
html
1<input type="text" name="your_name" class="short" /> 2<input type="text" name="your_email" class="middle" />
というHTMLタグがある場合にそれぞれのinputタグについて、typeの位置とclassの位置を取得して、アトリビュート名を変更したいのです。
typeをtitleに変更、classをidに変更、といったように。
typeとclassを別々にマッチさせれば処理できることは分かっているのですが、対象のHTMLファイルが大きいので、一度のマッチで処理したいと考えています。
お分かりになる方、ご教授いただけないでしょうか。
###発生している問題・エラーメッセージ
一つだけならマッチさせることができたが、複数をマッチさせるにはどうしたらいいか分からない。
###該当のソースコード
phpのpreg_match_allを使った単一の場合のマッチング。
思いどおりに動作します。
php
1$input = <<<EOT 2<input type="text" name="your_name" class="short" /> 3<input type="text" name="your_email" class="middle" /> 4EOT; 5 6// インプットタグのtypeアトリビュートの位置を取得 7$pattern = '/<input\s.*?(type).*?>/i'; 8$result = preg_match_all($pattern, $input, $matches, PREG_OFFSET_CAPTURE); 9 10var_dump($matches);
出力(単一の場合は想定どおり)
array(2) { [0]=> array(2) { [0]=> array(2) { [0]=> string(52) "<input type="text" name="your_name" class="short" />" [1]=> int(0) } [1]=> array(2) { [0]=> string(54) "<input type="text" name="your_email" class="middle" />" [1]=> int(54) } } [1]=> array(2) { [0]=> array(2) { [0]=> string(4) "type" [1]=> int(7) } [1]=> array(2) { [0]=> string(4) "type" [1]=> int(61) } } }
下記のように、同一マッチに複数のサブマッチをさせたい場合にどうしたらいいか分かりません。
###試したこと
classアトリビュートの位置も取得したい場合、コード中のパターンを以下のようにしてみました。
間違っている気がしつつ、実行して見ましたがうまくいきません。
php
1// インプットタグのtypeとclassアトリビュートの位置を取得 2$pattern = '/<input\s.*?(type)(class).*?>/i';
出力
array(3) { [0]=> array(0) { } [1]=> array(0) { } [2]=> array(0) { } }
期待する出力は以下のようなイメージのものです。
もしかしたら、ネストもうひとつが深くなるのかもしれませんが。
array(2) { [0]=> array(4) { [0]=> array(2) { [0]=> string(52) "<input type="text" name="your_name" class="short" />" [1]=> int(0) } [1]=> array(2) { [0]=> string(52) "<input type="text" name="your_name" class="short" />" [1]=> int(0) } [2]=> array(2) { [0]=> string(54) "<input type="text" name="your_email" class="middle" />" [1]=> int(54) } [3]=> array(2) { [0]=> string(54) "<input type="text" name="your_email" class="middle" />" [1]=> int(54) } } [1]=> array(4) { [0]=> array(2) { [0]=> string(4) "type" [1]=> int(7) } [1]=> array(2) { [0]=> string(4) "class" [1]=> int(36) } [2]=> array(2) { [0]=> string(4) "type" [1]=> int(61) } [3]=> array(2) { [0]=> string(4) "class" [1]=> int(91) } } }
他にも、
php
1$pattern = '/<input\s.*?(type).*?>|<input\s.*?(class).*?>/i';
も試しましたが、classはマッチしませんでした。
###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報
回答1件
あなたの回答
tips
プレビュー