ここから本文です

正規表現でループ?させることは可能でしょうか?

アバター

ID非公開さん

2017/3/102:00:09

正規表現でループ?させることは可能でしょうか?

対象テキスト-------------------

<div class="class1">
<div class="class1" id="id1">
<img border="1" src="image1.png" width="128" height="128">

------------------------------------


行いたいこと------------------

タグ内にあるプロパティと値を取得したいです。
上記(対象テキスト)の場合、以下の7項目を取得したいです。
class="class1"
class="class1"
id="id1"
border="1"
src="image1.png"
width="128"
height="128"
--------------------------------


私が考えた正規表現----

<.*?( .*?)*>

------------------------------


質問です-----------------

<div>や<img>など他タグでも同様ですが、
プロパティ(class,id)の数が定まっておらず
0個かもしれないし、10個かもしれないという時に
<.*?( .*?)*> この正規表現の右から2つ目のアスタリスクで
私のやりたいことが実現できるかと思ったのですが、
うまくいきません。どのようにパターンを変えればよろしいのでしょうか・・
どなたか正規表現に詳しい方いらっしゃいますでしょうか?

現在の状況
http://imgur.com/LAy4U0o

正規表現を試しているサイト
http://rubular.com

閲覧数:
97
回答数:
3
お礼:
50枚

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

tez********さん

2017/3/110:19:50

対象テキストが本当にそういう状態であれば、全然問題ないと思います。

$str = <<<EOL
<div class="class1">
<div class="class1" id="id1">
<img border="1" src="image1.png" width="128" height="128">
EOL;

preg_match_all('/\w="[^"]*"/', $str, $mch);
var_dump($mch[0]);

で結果は
array (size=7)
0 => string 's="class1"' (length=10)
1 => string 's="class1"' (length=10)
2 => string 'd="id1"' (length=7)
3 => string 'r="1"' (length=5)
4 => string 'c="image1.png"' (length=14)
5 => string 'h="128"' (length=7)
6 => string 't="128"' (length=7)


でも実際の対象テキストはもう少し違うモノなんじゃないでしょうかねぇ...

アバター

質問した人からのコメント

2017/3/1 13:49:52

カテゴリマスターの皆様、回答誠にありがとうございます。

とても参考になり、全てに目を通させて勉強させて頂きます。

ベストアンサー以外の回答

1〜2件/2件中

並び替え:回答日時の
新しい順
|古い順

プロフィール画像

カテゴリマスター

ryo********さん

2017/3/110:13:04

DOMDocumentでパースしてDOMXPathを使うべき,に1票。正規表現は銀の弾丸ではありません。

PHPネイティブのDOMによるスクレイピング入門 - Qiita
http://qiita.com/mpyw/items/c0312271819baee09132

<?php

$html = '
    <div class="class1">
        <div class="class1" id="id1">
            <img border="1" src="image1.png" width="128" height="128">
        </div>
    </div>
';


$dom = new DOMDocument;
libxml_use_internal_errors(true);
$dom->loadHTML(
    mb_convert_encoding($html, 'HTML-ENTITIES', 'UTF-8'),
    LIBXML_HTML_NOIMPLIED | LIBXML_HTML_NODEFDTD
);
libxml_clear_errors();
$xpath = new DOMXPath($dom);

foreach ($xpath->query('//@*') as $node) {
    var_dump("$node->nodeName : $node->nodeValue");
}

buy********さん

2017/3/109:07:50

>ID非公開さん

正規表現でも可能だけど
真面目に構文解析したいなら
正規表現じゃなくて構文解析ツールか
HTMLパーサーを使うべき

PHPにもあるでしょ
PHPのが使いにくければ
それらが使える別言語で処理させるようにPHPから呼びだして
処理した後に取り込めばOK

***無理矢理正規表現でやるなら
後方参照とかで
タグ名とそれ以外を取りだして
タグ名以外を区切り文字で分割
あるいは要素の先頭を取りだせるような正規表現を用意して
先頭部分とそれ以外を正規表現の後方参照で取りだしていけば
ループで取りだせないこともないけど

真面目にパースするなら
上に書いたように構文解析ツールとか正規表現以外のツールを使った方がすっり書けると思う

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる