• ベストアンサー

改行や、タブを含む正規表現の方法

HTMLからある部分抜き出す時、 たとえば、あるソースから <title>なんたら</title> という言葉を抽出する場合、 $htmlに全ソースが格納されていると仮定して 単純な正規表現で preg_match('/<title>なんたら</title>/', $html, $matches); といえれると、"<title>なんたら</title>"という文字が出せます。 ところが <title>   なんたら </title> のような改行やらタブが含まれていると抜き出すことができませんでした。 いろいろ調べますと、文字エスケープシーケンスというものがあり \nは改行 \tタブと書いてあるサイトがありましたので preg_match('/<title>\n\tなんたら\n</title>/', $html, $matches); という風に記述してみました。 しかし、それでも改行とタブの含まれた<title>から 文字を抜き出すことはできませんでした。 改行とタブの含まれた<title>から 文字を抜き出すには、どのような記述をすれば良いのか ご指導お願いいたします。

  • PHP
  • 回答数2
  • ありがとう数4

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

  • ベストアンサー
  • tany180sx
  • ベストアンサー率63% (239/379)
回答No.1

こんなのでどうでしょうか。 preg_match("/<title>\s*なんたら\s*<\/title>/", $html, $matches);

yuzuru0024
質問者

お礼

回答有難うございます。 参考にしてみます。

その他の回答 (1)

回答No.2

もっと綺麗な書き方があるかと思いますが、参考程度に。 preg_match("/.*?(<title>.*?<\/title>).*/is", $html, $matches)

yuzuru0024
質問者

お礼

回答有難うございます。 参考にしてみます。

関連するQ&A

  • 正規表現での改行数を求めるにあたって

    以下の文字列がフォームからPOSTされたとします。 ------------------- 1 2 3 4 5 ------------------- ポストされた文字列が$strに格納されているとして、 以下を実行しました。 ------------------- print preg_match_all("[\n\r]", $str, $dummy); print preg_match_all("[\r\n]", $str, $dummy); print preg_match_all("[\r]", $str, $dummy); print preg_match_all("[\n]", $str, $dummy); ------------------- 結果はこうなりました。 ------------------- 6 6 10 10 ------------------- どうやらマッチパターンが"[\n\r]"と"[\r\n]"の場合は空白行の数を、 "[\r]"と"[\n]"の場合は純粋に改行数を返しているようです。 どうしてこのような差が出るのでしょうか? 文字コードはEUC、改行コードはLFで統一していますが関係ありますか?

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

    正規表現/Uについて preg_match('/^(.*)(:([0-9]+))?$/U',$HTTP_SERVER_VARS['HTTP_HOST'],$matches)のUは改行などがあってもマッチさせるために入れてあるのでしょうか。また/^(.*)(:([0-9]+))?$/UのUをなくして*や+や?を加えて表すとどんな式になるのでしょうか。

    • 締切済み
    • PHP
  • 、"(ダブルクォーテーション)で囲まれている文字列を正規表現で取得

    質問させてください。 abcdef -s "xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh" asdakjsd のような文字列があります。 これの、"(ダブルクォーテーション)で囲まれている文字列を取得したいのですが、正規表現がうまくいきません。 取得結果としてはは、xsalkjsdflsd#$%_asdasdlasdlakjsd&=Daskdjh の部分がほしいです。 preg_match('/"([.*])"/', $str, $matches);とやったり preg_match('/\"([.*])\"/', $str, $matches);とやったり preg_match('/\"([.*?])\"/', $str, $matches);とやったりしたのですが、 どうしても$matchesにほしい結果は入っていません。 どのような正規表現で取得可能でしょうか? 何卒ご教授ください。

    • ベストアンサー
    • PHP
  • 独自タグを正規表現で取る方法

    今下のような文字列から、正規表現を使って##LOOP_START##から##LOOP_END##の間の文字列を抜き出そうとしています。 $target = '##LOOP_START##123 456789##LOOP_END##'; コードは以下です。 preg_match_all('/##LOOP_START##(.+?)##LOOP_END##/', $target, $matches); しかし、戻り値は0が帰ってきており、何も取得できません。 いろいろ調べたていたのですが、何か悪いのかさっぱりわからないので 投稿させていただきました。 ちなみに $target = '##LOOP_START##123456789##LOOP_END##'; のように途中が改行されていなければ 問題なく取得できました。 改行も含めてどうやったら抜き出せるでしょうか。。 よろしくお願いしますm(_ _)m

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

    PHP5.2.4を使用しています。 任意の数の引数がある文字列をpreg_matchを使ってマッチさせたいのですが、 例えば"ENUM(ab,cd)"は ab と cd の2つの引数があるとします。 次のようなパターン文字列まではアイデアとして浮かんだのですが、 引数の最後は , がないので当然ですがマッチしません・・・ どのようにパターン文字列を記述すれば良いのでしょうか? $str = "ENUM(ab,cd)"; if (preg_match("/ENUM\(([^\,]+\,)+\)/", $str, $match)) { print "{$match[0]}<br>\n"; }

    • 締切済み
    • PHP
  • 正規表現パターンの記入方法について

    とあるサイトで、 「URL からドメイン名を得る」という項目があったのでマネして やってみたらうまくいきました。しかし正規表現パターンの意味は 理解できませんでしたので理解できなかった部分だけをのせたスクリプトを以下にまとめました。 <?php // まずUPLからホスト名を得る preg_match('@^(?:http://)?([^/]+)@i', "http://www.nantoka.com/index.html", $matches); $zenbu=$matches[0]; $host = $matches[1]; $saigo=$matches[2]; /*必要なのはホスト名だけですが、$matches[0]や$matches[2]には どんな文字列が格納されるか気になって出力することにしました*/ print($zenbu); print("<br/>"); print($host); print("<br/>"); print($saigo); print("<br/>"); ?> これを実行した結果は、 $zenbuが「http://www.nantoka.com」で、 $hostが「www.nantoka.com」で、 $saigoがなにもなしでした。 このスクリプトでわからない部分は、'@^(?:http://)?([^/]+)@i'の部分と、$host = $matches[1];の部分です。 まず正規表現パターンの最初のアットマークの後ろの^は「次の文字列からはじまる」と解釈しました。 最後のアットマークの後ろのiは、「大文字と小文字を区別しない」という意味だと解釈しました。 カッコで囲まれている(?:http://)と、([^/]+)は、サブマッチパターン だと思いました。 $matches[0]には、"http://www.nantoka.com/index.html"の 中で'@^(?:http://)?([^/]+)@i'に当てはまるもの全体が格納され、 $matches[1]には、(?:http://)に当てはまるもの、 $matches[2]には、([^/]+)に当てはまるものが格納されると考えました。 [^/]+は、「スラッシュを含まない文字が1文字以上」と解釈しました。 ただ、その他の事については考えましたがよくわからず、 特になんで(?:http://)にあたるものが「www.nantoka.com」 になるのかさっぱりわかりません。 (?:http://)の中にあるhttp://の前の?:が一体何なのか、 (?:http://)と([^/]+)の間にある?は何なのか、 両端のアットマークは何なのか(マッチ演算子かと思って スラッシュに置き換えて実行してみたらエラーになりました。) うまく説明できませんがとにかくその辺のことがよくわかりませんでした。どなたか教えていただけませんか。

    • 締切済み
    • PHP
  • ページ全体の特定語句の抽出の正規表現について

    このジャンルでお願いします。 このページの http://eow.alc.co.jp/study/UTF-8/ 変化形 : から 分節stud・y までの間のそれぞれの語句を抽出したいのですが、 例えば、「変化形 :」や「発音」の部分なら次のような正規表現で一応抽出はできたのですが、 preg_match_all('/"\)\'>([a-z]+)<\/a>/', $str, $matches); print_r($matches); preg_match('/"pron">([^<]+)<\/span>/', $str, $matches); print_r($matches); その間の「【名】」「【自動】」「【他動】」の間にある語句などの抽出方法が思い浮かばないのですが、 どう記述すれば良いのかアドバイスを頂けないでしょうか?

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

    こんにちは。最近、正規表現の勉強を始めました。 以下のプログラムをテストしているのですが、思ったとおりに動かずに困っています。 (1)円マークにヒットしない (2)行頭の”今日”にヒットしない(この場合2と4行目にヒットするのでは?) 何がおかしいのか、アドバイスをいただけませんか? <html> <head> <title>正規表現のテスト</title> </head> <body> <pre> <?php $post = '\750 今日は晴れです。今日は晴れです。今日は晴れ です。今日は晴れです。今日は晴れです。今日は晴れです。 今日は晴れです。今日は晴れです。今日は晴れ です。今日は晴れです。今日は晴れです。今日は晴れです。'; function my_insert_post($post){ global $post; preg_match_all("/\\/", $post, $matches);//(1) print_r($matches); preg_match_all("/^今日/", $post, $matches02);//(2) print_r($matches02); echo "<hr />"; print_r($post); } my_insert_post(); ?> </pre> </body> </html> どうぞよろしくお願いいたします。

    • ベストアンサー
    • PHP
  • 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
  • PHPにおける正規表現について

    PHPにおける正規表現について ご教授ください。 いわゆる、対象の文字列が複数行にわたっていた場合のことです。 $data = <<< EOF ABCDE FGH EOF; $hoge = preg_match("/EF/" ,$data,$match); と上記のようなコードがあった場合 対象の文字列群から【EF】という文字列を検索したい場合、どのように記述したら 【E(間に改行)F】の文字列と一致させる事ができるでしょうか? 仮に正規表現の修飾子の【s】や【m】を用いても上記の例の場合 一致させることができないと思います。 やはり、対象の文字列群 $data の改行文字をいったん削除したものから検索 するのがベターでしょうか? 正規表現に造詣の深い方よろしくご教授ください。

    • ベストアンサー
    • PHP