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

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

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

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

Q&A

解決済

1回答

2376閲覧

PHPのSimple HTML DOM Parserで正規表現でfind

landmine

総合スコア55

PHP

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

正規表現

正規表現とは特定の文字列によるパターンマッチングを行う際に用いられる宣言型プログラミングです。

0グッド

0クリップ

投稿2016/11/14 09:53

###やりたいこと
PHPのSimple HTML DOM Parserを用いてfindをするとき、正規表現で探したい。

php

1<?php 2require_once 'simple_html_dom.php'; 3mb_language('Japanese'); 4$url = "httpなんとかかんとか"; 5$buf = mb_convert_encoding(file_get_contents($url), 'UTF-8','auto'); 6$dom = str_get_html($buf); 7echo $dom 8foreach($dom->find( '[id=comment]') as $key => $element ){ 9 $element->outertext = ''; 10} 11echo $dom;

このようにすればurl先のhtmlのidがcommentの部分を削除できると思います。ただ、例えばidがCommentやcomMENTなどのように大文字小文字を無視してfindしたいのですが、ここで正規表現は使えるでしょうか?そもそも正規表現を使えばいいと思っていたのですが、

php

1 $buf = preg_replace("/<([\w]+)[^>]*?comment.*?>.*?<\/\\1>/ius","",$buf);

このようにしてしまうとタグが入れ子になった時などに予期しない削除となってしまうため、質問しました。
どうしても正規表現でfindしたい場合は、正規表現でマッチするか探して1つずつfindしていくといった方法になるのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

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

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

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

guest

回答1

0

ベストアンサー

以下のようにまずはpreg_match_allで大文字小文字を区別しないcommentのパターンを抽出して、そのパターンすべてでfindしてはどうでしょうか
※若干処理は無駄ですが、実装はわりと簡単です。

php

1<?php 2require_once 'simple_html_dom.php'; 3$html = "<html><body><div id='comment'></div><p></p><div id='Comment'></div><body></html>"; 4preg_match_all("/comment/ius", $html, $matches); 5$dom = str_get_html($html); 6foreach($matches[0] as $id) { 7 foreach($dom->find("[id=$id]") as $key => $element ) { 8 $element->outertext = ''; 9 } 10} 11echo $dom . "\n";

(改良版)
findをループするのではなく、カンマ区切りで複数指定する方法が多分パフォーマンスはいいと思うので、以下のようにしてみました。

php

1<?php 2require_once 'simple_html_dom.php'; 3$html = "<html><body><div id='comment'></div><p></p><div id='Comment'></div><body></html>"; 4preg_match_all("/comment/ius", $html, $matches); 5$dom = str_get_html($html); 6$patterns = array(); 7foreach($matches[0] as $id) { 8 $patterns[] = "[id=$id]"; 9} 10foreach($dom->find(implode(',', $patterns)) as $key => $element ) { 11 $element->outertext = ''; 12} 13echo $dom . "\n";

(追記) これが正解かもしれません
さらに調べていたら(コードを読んでいたら)、findの第三引数をtrueにすると大文字小文字を区別しないで検索できるみたいでした...公式ドキュメントには書いてなさそうだったので、よくテストしてみてください

php

1<?php 2require_once 'simple_html_dom.php'; 3$html = "<html><body><div id='comment'></div><p>AAA</p><div id='Comment'></div><body></html>"; 4$dom = str_get_html($html); 5foreach($dom->find("[id=comment]", null, true) as $key => $element ) { 6 $element->outertext = ''; 7} 8echo $dom . "\n";

投稿2016/11/14 12:49

編集2016/11/14 13:38
popobot

総合スコア6586

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

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

landmine

2016/11/17 05:14

返事が遅くなってしまい申し訳ありません。 実の所大文字小文字だけではなく、「コメントと思われるものをできるだけ取り除く」といったことがしたかったので、正規表現でマッチさせる方法が良さそうだと思いました。第三引数についての情報もとても助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問