質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

Q&A

解決済

2回答

481閲覧

PHPのpreg_matchの正規表現について

退会済みユーザー

退会済みユーザー

総合スコア0

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

0グッド

0クリップ

投稿2018/02/01 09:41

正規表現の書き方がわかりません。

<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ページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
yambejp

総合スコア114829

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/02 07:27

回答ありがとうございます。 独学で学習しているため「DOMDocument クラス」の言葉を聞いてピンとこないのですが下記のようなコードのことでしょうか。 よろしくお願いします。 <? .... $php_query_obj = phpQuery::newDocument(mb_convert_encoding($html_text, 'HTML-ENTITIES', 'UTF-8')); .... $sample_text = $php_query_obj['div.table-sample']->text(); var_dump($sample_text); ?>
yambejp

2018/02/02 07:50 編集

> ピンとこない sampleを追記しておきました
退会済みユーザー

退会済みユーザー

2018/02/02 08:02

回答ありがとうございます。 参考にさせていただきます。また何かありましたらよろしくお願いします。
guest

0

ベストアンサー

<div class="table-sample"> を取りたいならstrposでも何でも良いと思うのですが、具体的に何が取りたいのでしょうか?
  • divに他の属性があるのでそれを取りたい?
  • <div class="table-sample">ここ</div>の「ここ」が取りたい?

投稿2018/02/01 09:44

dala00

総合スコア441

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2018/02/01 09:50

回答ありがとうございます。preg_matchの方がいいと聞いてからなんとなくpreg_matchで取得しています。 <div class="table-sample">ここ</div>のここに文字列(あいうえおかきくけこさしすせそ)があり、それを$matchesに入れたいです。 よろしくお願いします。 '/div="([^"]+)"[^>]+class="table-sample"></div>/',ですか??
dala00

2018/02/01 09:51

/<div class="table-sample">([^<]+)/ これですね
退会済みユーザー

退会済みユーザー

2018/02/01 09:54

回答ありがとうございます。 試してみます。ちなみに正規表現の書き方とか意味を聞く場合は質問を分けて新規で投稿した方がいいのでしょうか。 皆さんどうやって正規表現を書かれているのでしょうか。 よろしくお願いします。
dala00

2018/02/01 09:58 編集

シンプルにそのまま考えたら良いですよ。 まず <div class="table-sample"> があって、 次に取りたい文字があるが、終端タグ開始までを取りたいので ([^<]+) を上記にくっつける。 という、やりたいことをそのまま並べてくっつけるだけです。 挟まれるという意味では</div>も必要そうな気もしますが、ここは別に取りたい文字の後なので不要、みたいな感じです。
退会済みユーザー

退会済みユーザー

2018/02/02 07:30

回答ありがとうございます。 '/<div class="table-sample">/'が通常?の正規表現で</div>まで取りたいなら末尾に([^<]+)をつけるという理解でよろしいでしょうか。 例えばこれがhtmlタグではなく、日本語の場合も知りたいのですが一旦こちらのdala00さんの回答をベストアンサーにして再度日本語の正規表現の質問をポストした方がいいのでしょうか。 teratailの使い方がまだよくわからないです。 よろしくお願いします。
dala00

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">/の形になるという理解でよろしいですか。 上記をもとに考えると日本語を取得する場合、特定のワード(例:実験内容)が文中に必ず入っているページなら'/実験内容/'が正規表現で、それ以降を取得する場合の書き方は…と思いましたが再度質問ポストします! 回答ありがとうございます!!
dala00

2018/02/02 08:01

> <div class="table-sample">をのみを抜き取りたい場合(ないと思いますが)/<div class="table-sample">/の形になるという理解でよろしいですか。 はい、上記のとおりです。固定の文字だったら正規表現でなく、strposでも良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問