preg_matchで正規表現がうまくいかない | ソースコードから<rdf:Description~~~/>を取得する方法

このQ&Aのポイント
  • 質問者は、ソースコードから<rdf:Description~~~/>タグの情報を取得するために、preg_match_allを使用しましたが、正規表現がうまくいきませんでした。
  • 質問者は、正規表現を調査しましたが、<rdf:Description~をマッチすることはできても、/>で閉じることができなかったと報告しています。
  • 質問者は、正規表現がうまくいかない原因と、<rdf:Description~~~/>を抜き出すための正規表現を教えてほしいと求めています。
回答を見る
  • ベストアンサー

preg_matchの正規表現がうまくいかない

たとえば、http://gehasoku.com/?p=2のソースコードには ------------------- <rdf:Description rdf:about="http://www.com/aaa.html" trackback:ping="http://www.com" dc:title="タイトル" dc:identifier="http://iii.com/bbb.html" dc:subject="ハードウェア" dc:description="1 名前:名無しさん " dc:creator="soft_net" dc:date="2012-02-21T20:05:01+09:00" /> ------------------- のような形の<rdf:Description~~~/>タグの情報ががいくつかあると思います。これらすべてを文字列として取得したくて、次のようなphpを作成しましたが、うまく動作しません。 原因はどうやらpreg_match_allの正規表現がうまくいっていないからのようですので、 <rdf:Description~~~/>を抜き出すことができる正規表現を教えてください。 自分でもここでチェックしながらやりましたが、 http://www.rider-n.sakura.ne.jp/regexp/regexp.php <rdf:Description~をマッチすることはできても、/>で閉じることができませんでした。 よろしくお願いします。 <?php $url="http://gehasoku.com/?p=2"; $html=file_get_contents($urls); preg_match_all("/<rdf:Description(.*)?\/>/",$html,$match); print_r($match); foreach($match[1] as $value){ echo $value; } ?>

  • PHP
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

修飾子sを指定するとか。 http://ideone.com/OWnp8 あと、こんなのとか。 http://ideone.com/U1rdP

crouch-tancle
質問者

お礼

下の方で無事にできました! 本当にありがとうございました

関連するQ&A

  • PHPの正規表現「preg_match」で漢字を含む場合のマッチパター

    PHPの正規表現「preg_match」で漢字を含む場合のマッチパターンについて 宜しくお願い致します。 preg_matchを使っての正規表現で、「あいうえおかきくけこ3月10日さしすせそ」という文字列から「3月10日」だけを抽出するには、どういうパターンが良いのでしょうか? 下記の様にやってみましたが、だめでした。。。 preg_match("/\d{1,2}[月]\d{1,2}[日]/",$hoge,$match) これではうまくいきません。 どなたかお助けくださいー!

    • ベストアンサー
    • PHP
  • preg_matchの正規表現

    PHPの掲示板でemailアドレス(携帯のemailも含む)を投稿できないようにpreg_matchする正規表現を教えてください。

    • ベストアンサー
    • PHP
  • preg_matchの正規表現で

    空白があってもなくてもマッチするようにするにはどうやって表現したらよいでしょうか。 マッチ条件:"佐藤ヨシオ" 対象:"佐藤 ヨシオ","佐藤ヨシオ","佐藤ヨ シオ"; これらすべてにマッチするようにしたいです。 x:拡張正規表現(空白が無効) と他サイトで見かけたのですが、これをどうやって使えばいいのかわかりません。 preg_match("佐藤ヨシオ",$val); このようにやってみてもうまく動いてくれません。 ヒントでもいいので教えていただけたらと思います。

    • 締切済み
    • PHP
  • 正規表現について

    PHPにおける正規表現についての質問なのですが、 preg_match('#^/user/(?P<id>[^/]+)$#', $string) 第一引数の正規表現がいまいち理解できません。 ご教授のほど宜しく御願いします。

    • 締切済み
    • PHP
  • http://とhttps://のどちらでもマッチングできる正規表現

    http://とhttps://のどちらでもマッチングできる正規表現の書き方が分かりません。aタグの中のhref="のあとのURL部分にhttpでもhttpsのどちらでもOKのマッチングをかけたいです。 具体的にはhttp://www.aaa.co.jpでもhttps://www.aaa.co.jpのどちらでもpreg_match_allでマッチングをかけたいです。 $count=preg_match_all("正規表現",$URL,$maches); という感じでhttpかhttpsのURLに引っ掛けたいです。 教えてください

    • ベストアンサー
    • PHP
  • 正規表現の「^」と「$」がうまくいかない

    正規表現の「^」と「$」を使うとうまく働いてくれません。 あるデータの中の、行頭がhttpで始まる1行を取り出したいです。 あるデータ$dataを preg_match_all("/^http(.*?)$/",$data,$result); print_r($result); で出力すると、 ■結果 Array ( [0] => Array ( ) [1] => Array ( ) ) となり、うまくいきません。 preg_match_all("/http(.*?)\n/",$data,$result); やけでこんな感じにやったら、行頭から始まるhttp.....も行頭からはじまらないものもゲットしてすべて出力してくれてしまいます。 行頭から始まるものだけを出力するにはどうしたらいいでしょうか。 php5 UTF-8環境

    • ベストアンサー
    • PHP
  • 正規表現 preg_match_all 

    $c = preg_match_all('@href="/Top/World/Japanese/(?P<query>.*?)">(?:<b>|)(?P<cate>.*?)(?:</b>|)</a>@s', $buf,$match,PREG_SET_ORDER); print_r($match); の(?:<b>|)と(?:</b>|)の部分がまちがっているので、<b></b>タグがあってもなくてもいい場合にマッチさせることができないと思っています。 どうか教えてくださいませ。 ちなみにPHPの5.2.2です。

    • ベストアンサー
    • PHP
  • 正規表現について

    電話番号の正規表現について質問です。 $value = '000-111-2222'; これだけだと通りますが function tel( $value ) { return !preg_match( '/^\d{2,3}\-\d{3,4}\-\d{4}$/', $value ); } 市外局番がなくても通るようにしたくこのようにしましたがはじかれます^^; function tel( $value ) { return !preg_match( '/^\d{2,3}\-\d{3,4}\-\d{4}$ | ^\d{2,4}\-\d{3,4}$/', $value ); } いずれのケースにも当てはまらないのではじくようにしたいのですが、実現するにはどう書けばいいのでしょうか?

    • ベストアンサー
    • PHP
  • preg_matchでの コンマ について 

    phpでの正規表現で 「もしも変数$wordへ入力した文字列が Japan's という文字列に一致すれば」というスクリプトを作成しましたが、うまくいきません。 if(preg_match("/japan\'s/i",$word,$match)){ この Japan's における カンマの取り扱いを このケースではどうしたらいいかよくわかりません。 \' としてみましたが、うまくいきません。 なにかアドバイスやヒントがありましたら、よろしくお願いします。 ああでもない、こうでもないとやってみましたが、その過程で 唯一 Japan's にヒットしたのは、次のスクリプトでした。 if($word=="japan\'s") ただし、これは正規表現は使っていないわけですよね。 なにか、自分のローカル環境に問題があるのかと思い、レンタルサーバーに同じものをuploadして試して見ましたが、やはり結果は同じで、ヒットしませんでした。別のパソコンでもやってみましたが、結果は同じでした。 整理しますと、 (preg_match("/japan's/i",$word,$match) ではヒットせず、よって コンマの前に\をつけて(preg_match("/japan\'s/i",$word,$match) としましたが、これもヒットしなかったということになります。 1) (')は正規表現の特殊文字でないはずですから、そのまま使えるはずだと思いましたが、なぜかこれが使えない。 2) しかも、その前にエスケープの \ をつけても、そのエスケープ が効かないのはなぜか。 追記: 最近分かったこと。 おもしろいことに、 'j すると、hitする。でも、j' とするとヒットしない。 ということは、コンマ自体には問題ないのだろうと推測しています。でも、文字の後にコンマがつくと、preg_matchにとって特別な意味を持つ文字列に変わるのではないか。

    • ベストアンサー
    • PHP
  • preg_matchの検索について

    <?php  header("content-type: text/plain");  $pat = '/<a href="([^"]*)">/';  $html="<p><a href=\"http://test.net/test3.html\">リンク</a></p>";  preg_match($pat,$html,$match); print_r($match); ?> 上記正規表現プログラムを作成しました。 結果を確認したところ、 Array ( [0] => <a href="http://test.net/test3.html"> [1] => http://test.net/test3.html ) このようにでるのですが、[1]つめが存在している理由がわかりません。 [0]だけが出てくると思っていたのですが、なぜ、[1]はどのような理由で作成されたのでしょうか。 ご教授よろしくお願いします。

    • ベストアンサー
    • PHP

専門家に質問してみよう