正規表現の書き方がわかりません。
<div class="table-sample">があり、それを取得したい場合、下記だと上手くとれませんでした。下記の場合の正規表現が知りたいです。
よろしくお願いします。
PHP
1 2HTML_test_date//"<div class="table-sample">含むhtmlタグが入っています。"; 3 4<? 5preg_match_all( 6 '/div="([^"]+)"[^>]+class="table-sample">/', 7 $HTML_test_date, 8 $matces 9 ) 10var_dump($matces); 11 12?>
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
HTMLのclass名を元にデータを抜き出すのであればやはり
DOMDocument クラスのような
ライブラリで抜き出すことがおすすめです。
たとえば
HTML
1test<div id="hoge" class="hogehoge table-sample fugafuga" data-class="fuga">test1</div>test
のように複雑になってくると文字列の評価ではやや無理がでてきます
sample
たとえばこうしてください
PHP
1mb_internal_encoding("UTF-8"); 2$str=<<<eof 3test<div>ごみ</div> 4test<div class="table-sample">これはいる</div>test 5test<div id="hoge1" class="hogehoge table-sample fugafuga" data-class="fuga">これもいる</div>test 6test<div id="hoge2" class="hogehoge fugafuga" data-class="table-sample">これはいらない</div>test 7test<div>ごみ</div> 8eof; 9$doc=new DOMDocument(); 10$doc->loadHTML("<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />\n".$str); 11/* metaの指定をしないと文字化けすることがある */ 12$nodes = $doc->getElementsByTagName("div"); 13 14$a=[]; 15$pattern="/(^| )table-sample( |$)/"; 16foreach($nodes as $node){ 17 if(preg_match($pattern,$node->getAttribute("class"))){ 18 $a[]=$node->nodeValue; 19 }; 20} 21print_r($a);
投稿2018/02/01 11:16
編集2018/02/02 07:51総合スコア114829
0
ベストアンサー
<div class="table-sample">
を取りたいならstrposでも何でも良いと思うのですが、具体的に何が取りたいのでしょうか?
- divに他の属性があるのでそれを取りたい?
- <div class="table-sample">ここ</div>の「ここ」が取りたい?
投稿2018/02/01 09:44
総合スコア441
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答ありがとうございます。preg_matchの方がいいと聞いてからなんとなくpreg_matchで取得しています。
<div class="table-sample">ここ</div>のここに文字列(あいうえおかきくけこさしすせそ)があり、それを$matchesに入れたいです。
よろしくお願いします。
'/div="([^"]+)"[^>]+class="table-sample"></div>/',ですか??
2018/02/01 09:51
/<div class="table-sample">([^<]+)/
これですね
退会済みユーザー
2018/02/01 09:54
回答ありがとうございます。
試してみます。ちなみに正規表現の書き方とか意味を聞く場合は質問を分けて新規で投稿した方がいいのでしょうか。
皆さんどうやって正規表現を書かれているのでしょうか。
よろしくお願いします。
2018/02/01 09:58 編集
シンプルにそのまま考えたら良いですよ。
まず
<div class="table-sample">
があって、
次に取りたい文字があるが、終端タグ開始までを取りたいので
([^<]+)
を上記にくっつける。
という、やりたいことをそのまま並べてくっつけるだけです。
挟まれるという意味では</div>も必要そうな気もしますが、ここは別に取りたい文字の後なので不要、みたいな感じです。
退会済みユーザー
2018/02/02 07:30
回答ありがとうございます。
'/<div class="table-sample">/'が通常?の正規表現で</div>まで取りたいなら末尾に([^<]+)をつけるという理解でよろしいでしょうか。
例えばこれがhtmlタグではなく、日本語の場合も知りたいのですが一旦こちらのdala00さんの回答をベストアンサーにして再度日本語の正規表現の質問をポストした方がいいのでしょうか。
teratailの使い方がまだよくわからないです。
よろしくお願いします。
2018/02/02 07:40
いえ、回答としては
/<div class="table-sample">([^<]+)/
です。
/<div class="table-sample">/
だと本当に<div class="table-sample">しか取れないので、何の役にも立たないと思います。
上記のように正規表現の中で、preg_match_allは基本的に//の間の正規表現にマッチしたものを取ってきますが、括弧で囲んでいる部分があれば別途追加で取り出すことが出来ます。ですのでdivで囲まれた部分が取りたいのであれば上記の正規表現が答えとなります。実際に実行して、$matchesを見てみて下さい。
</div>は単にdivで囲まれたところを取りたいのであれば不要、という話のため、今回のdivの中の文字列を取りたい、という話とは全く関係ありません。
僕もteratailの使い方はよく分かりませんが、別の質問なら別のポストの方が良いかもしれませんね。
退会済みユーザー
2018/02/02 09:46 編集
回答ありがとうございます。
説明不足お許しください。
/<div class="table-sample">([^<]+)/ ←正規表現なのはdala00さんの回答で理解できました。
<div class="table-sample">をのみを抜き取りたい場合(ないと思いますが)/<div class="table-sample">/の形になるという理解でよろしいですか。
上記をもとに考えると日本語を取得する場合、特定のワード(例:実験内容)が文中に必ず入っているページなら'/実験内容/'が正規表現で、それ以降を取得する場合の書き方は…と思いましたが再度質問ポストします!
回答ありがとうございます!!
2018/02/02 08:01
> <div class="table-sample">をのみを抜き取りたい場合(ないと思いますが)/<div class="table-sample">/の形になるという理解でよろしいですか。
はい、上記のとおりです。固定の文字だったら正規表現でなく、strposでも良いと思います。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/02/02 07:27
2018/02/02 07:50 編集
退会済みユーザー
2018/02/02 08:02