[PHP正規表現]タグ以外のテキストを削除する方法

このQ&Aのポイント
  • PHP環境で、正規表現を使ってタグ以外のテキストを削除する方法を教えてください。
  • タグ以外のテキストを削除したい場合、preg_replaceなどの関数を使用して正規表現を記述します。
  • ただし、< >で囲まれたテキストを削除すると、aタグの間のテキストも削除されてしまいます。どのようにすれば、aタグの間のテキストを残しつつ、タグ以外のテキストを削除できるでしょうか?
回答を見る
  • ベストアンサー

[php][正規表現]タグ以外を削除したい

いつもお世話になっております。 PHP環境にて、ある文字列において、preg_replaceなどを使い正規表現を用いてタグ以外を削除したい場合、どのように記述すれば宜しいのでしょうか。 例えば、 ――――――――――――――――― これは画像です。<img src="http://example.com/img/example.jpg"> これはテキストリンクです。<a href="http://example.com">exampleへのリンク</a> これは画像リンクです。<a href="http://example.com"><img src="http://example.com/img/example.jpg"></a> これはYoutubeの埋め込み動画です。<iframe width="420" height="315" src="http://www.youtube.com/embed/EXAMPLE" frameborder="0" allowfullscreen></iframe> ――――――――――――――――― このような記述があった場合、imgタグ、aタグ、Youtube以外のすべての通常テキストを削除したいのです。 ↓タグ以外のテキスト削除後↓ ――――――――――――――――― <img src="http://example.com/img/example.jpg"> <a href="http://example.com">exampleへのリンク</a> <a href="http://example.com"><img src="http://example.com/img/example.jpg"></a> <iframe width="420" height="315" src="http://www.youtube.com/embed/EXAMPLE" frameborder="0" allowfullscreen></iframe> ――――――――――――――――― 最初<このカッコ>に囲まれているもの以外を削除しようと思ったのですが、そうするとaタグの間のテキスト(「exampleへのリンク」の部分)も一緒に削除されてしまいました。 こちらを実現するにはどのように行えば良いか、アドバイスいただけますと嬉しいです。 宜しくお願い致します。

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

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

  • ベストアンサー
  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.2

マッチするところ以外を削除するなら、マッチしたものをつなげるのが 手早いかもしれません <?PHP $html=<<<eof test<img src="1.jpg">test<img src="2.jpg">test test<a href="3.htm">test</a>test test<a href="4.htm"><img src="5.jpg"></a>test test<a href="6.htm">test<img src="7.jpg">test</a>test<img src="8.jpg">test test<a href="9.htm"><img src="10.jpg"><img src="11.jpg">test<img src="12.jpg"></a>test test<iframe src="13.htm" ></iframe>test eof; print "<pre>\n"; print htmlspecialchars($html); print "<hr>\n"; //実作業 ここから $pattern='/<(a|iframe) .*?>.*?<\/\\1>|<img .*?>/mis'; preg_match_all($pattern,$html,$m); $html=implode("\n",$m[0]); //ここまで print htmlspecialchars($html); print "</pre>\n"; ?>

doomdoom
質問者

お礼

教えていただいた内容で試した所 まさに望んだ内容で表示されました。 ありがとうございました!

その他の回答 (1)

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.1

ちょっと面倒な命題ですが htmlタグやbodyタグで囲まれてたら、全部残っちゃうのでは? という素朴な疑問もあります。 もし1行ごとに評価してよいならこんなのでも $pattern='/.*?(<.*>).*$/m'; $replacement='$1'; $html=preg_replace($pattern,$replacement,$html);

doomdoom
質問者

補足

ありがとうございます。 確かにhtmlやbodyタグがあると全部残ってしまうのですが、今回はそのような事はございません。 上記の例が、一行(改行なし)になっている前提で、全文を対象に一度に削除出来る方法を教えて頂けますと嬉しいです。

関連するQ&A

  • 正規表現の否定先読みについて

    <a href="http://example.com/aaaa/hogehoge1.jpg" target="_blank"><img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" target="_blank"> <img src="http://example.com/bbbb/hogehoge2.jpg" alt="huge2"></a> こういうHTMLがあるとします。改行はなく1行です。 このHTMLから正規表現で 『width="100"がついていない<img>タグ』 のsrc=""までを抜き出して置換したいのです。 期待する結果は <img src="http://example.com/hage/hogehoge2.jpg" です。 そこで /<img src="http:\/\/.*?.jpg"\s(?!width)/ というパターンを試しましたが、.*?の最短一致が思った通りにいかず <img src="http://example.com/aaaa/hogehoge1.jpg" width="100" alt="huge1"></a><br />hogehoge<br /><a href="http://example.com/bbbb/hogehoge2.jpg" と、1つ目の<img>が入ってしまい、2つ目の<a>タグまで抜き出されてしまいます。 これをうまくwidth="\d+"と入っていない<img>タグのみに適用させる方法はないでしょうか? どなたかよろしくおねがいいたします。

    • ベストアンサー
    • PHP
  • 正規表現を使って?

    置換の正規表現を使ってこのURLを (例) <A href="http://123.com/456/789/"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://123.com/456/789/">リンク先</A> このようにしたいです。 <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F"><IMG src="http://123/456/789.jpg" border="0"></A> <A href="http://tesuto=http%3A%2F%2F123.com%2F456%2F789%2F">リンク先</A> :は%3aに /は%2fに 最後にリンク先のURLにhttp://tesuto=を追加したいです。 (<IMG src="からのURLはそのままにしたいです。) ちなみにhtml内には様々なタグが入っていてリンク先も様々なURLが書かれているとします。 (http://123.com/456/789/やhttp://123.com/456/789/abc/dehg/など) 正規表現についてはまったく分からず悩んでいます。 どなたかよろしくお願いします。

  • 正規表現についての質問です。

    正規表現についての質問です。 現在、HTMLのimgタグを使って「/img/jpg/」ディレクトリにある画像ファイルを複数表示しています。 例) <img src="/img/jpg/1111.jpg" > <img src="/img/jpg/mm2222.jpg" > <img src="/img/jpg/kkkkk3333.jpg" > これをそれぞれ、以下のように置換したいと考えています。 例) <a href="http://www.xxxxx.jp/1111.jpg"><img src="/img/jpg/1111.jpg" width="240px"></a> <a href="http://www.xxxxx.jp/mm2222.jpg"><img src="/img/jpg/mm2222.jpg" width="240px"></a> <a href="http://www.xxxxx.jp/kkkkk3333.jpg"><img src="/img/jpg/kkkkk3333.jpg" width="240px"></a> imgタグをリンクタグで囲むのですが、リンク先URLには元々の画像ファイル名が使われています。また、imgタグには「width="240px"」が付加されています。 このような置換をPHP5で行うには、どのような正規表現を使用したらよろしいでしょうか。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 正規表現についての質問です。

    正規表現についての質問です。 現在、HTMLのimgタグを使って「/img/jpg/」ディレクトリにある画像ファイルを複数表示しています。 例) <img src="/img/jpg/1111.jpg" > <img src="/img/jpg/mm2222.jpg" > <img src="/img/jpg/kkkkk3333.jpg" > これをそれぞれ、以下のように置換したいと考えています。 例) <a href="http://www.xxxxx.jp/1111.jpg"><img src="/img/jpg/1111.jpg" width="240px"></a> <a href="http://www.xxxxx.jp/mm2222.jpg"><img src="/img/jpg/mm2222.jpg" width="240px"></a> <a href="http://www.xxxxx.jp/kkkkk3333.jpg"><img src="/img/jpg/kkkkk3333.jpg" width="240px"></a> imgタグをリンクタグで囲むのですが、リンク先URLには元々の画像ファイル名が使われています。また、imgタグには「width="240px"」が付加されています。 このような置換をPHP5で行うには、どのような正規表現を使用したらよろしいでしょうか。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • 正規表現(~を含まないものにマッチ)

    Perlの正規表現について質問です。 画像<img src="http://hogehoge.com/img/gokuu.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/pikkoro.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/bejiita.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/gohan.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="http://hogehoge.com/img/buruma.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> ↓ 処理後 ↓ 画像<img src="gazo_new1.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new2.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new3.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new4.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> 画像<img src="gazo_new5.jpg" border=0><a href="http://hogehoge.com/">hogehoge</a><br> (変更した画像:gokuu.jpg,pikkoro.jpg,bejiita.jpg,gohan.jpg,buruma.jpg,) 以上のように 画像URL部分のみを gazo_new(連番).jpg に変更させ、 変更前の画像URL一覧を表示させるスクリプトを書いてみました。 $htmldata にHTMLの全データが格納されているとします。 $i=1; while($htmldata=~/(<\s*img.*?src.*?=["\s]*)([.\/]*?\/)?((?:(?!gazo_new)[^"\s>])*)?["\s]?.*?>/i){ $imgurlparts .="$3,"; $htmldata=~ s/(<\s*img.*?src.*?=["\s]*)((?:(?!gazo_new)[^"\s>])*)?(["\s]?.*?>)/$1gazo_new$i.jpg$3/i; $i++; } $htmldata .="(変更した画像:$imgurlparts)"; どうにもうまく動きません。 何卒ご教示をお願い致します。

    • ベストアンサー
    • Perl
  • 戻り読みの代わりとなる正規表現について

    正規表現を使いたいのですが、 javascriptでは戻り読み表現が使えないと知って困っています・・・ <a href="http://abc.com/"><img src="http://image.abc.com/def.jpg"></a> <a href="http://hogehoge.com/"><img src="http://hogehoge.com/hoge.jpg"></a> <a href="http://123.com/"><img src="http://456.com/789.jpg"></a> <a href="http://momomo.com/"><img src="http://lelele.com/momo.jpg"></a> 上記のソースから http://image.abc.com/def.jpg http://hogehoge.com/hoge.jpg http://456.com/789.jpg http://lelele.com/momo.jpg だけをマッチさせたいです。 (画像のパスだけをマッチさせたい) URLは今後も増える可能性があり、サイト名、文字数、画像名などもバラバラです。 うまくマッチさせる方法はありますでしょうか。 詳しい方いらっしゃいましたらよろしくお願いします!

  • 甲子園フォーム規制?

    <iframe width="420" height="315" src="http://www.youtube.com/embed/CgYcrfia-eQ" frameborder="0" allowfullscreen></iframe> わかりますか?

  • preg_match_allで正規表現

    preg_match_allにて、次のように<img>が連続したソースから、 ※URLは全てダミーです <img src="http://a.com/a/a.jpg"><img width="10" src='http://b.com/b/b.gif' height="10"><img width="10" height="10" src='http://c.com/c/c.png"><img src=http://d.com/d/d.jpg><img src="http://e.com/hogefuga/e.jpg"> 個々のimgタグ全体と"<img~>"、 個々のsrc="~"のURLを抽出したいのですが、下記の条件でマッチさせることはできるでしょうか? 1. imgの属性位置・有無に問わず 2. 属性のくくりが、'" のどちらでも、または有無に問わず 3. src=~内に、"hogefuga"を含まないものにだけマッチ(否定形) 次のような正規表現で試したところ、 $pattern = '/<img.*?src=(\'|")?((?(?!hogefuga).)*\.(jpg|gif|png))(\'|")?.*?>/i'; 下のようにimgタグが1行づつ並んでいる場合は上手くいったのですが、連続して並んでいる場合は個々の、"<img~>"でマッチされませんでした。 ※URLは全てダミーです <img src="http://a.com/a/a.jpg"> <img width="10" src='http://b.com/b/b.gif' height="10"> <img width="10" height="10" src='http://c.com/c/c.png"> <img src=http://d.com/d/d.jpg> <img src="http://e.com/hogefuga/e.jpg"> 最終的にはsrc="~"のURLに応じて、画像をテキストリンクへ置換する、ということをしたいのですが、正規表現がよくわからず試行錯誤しています。 このような場合はどのような正規表現を書くべきなのでしょうか? どうぞよろしくお願いします。

    • ベストアンサー
    • PHP
  • Javaの正規表現でimgタグのaltとプレーンテキストのみを抜き出し

    Javaの正規表現でimgタグのaltとプレーンテキストのみを抜き出したいと思っています。 例えば、 <img src="image.jpg" alt="イメージ" />テキスト <img src="image.jpg" alt="イメージ" class="imgclass" />テキスト <img alt="イメージ" src="image.jpg" />テキスト は、全て「イメージテキスト」になるようにしたいのです。 imgタグが入っていない場合や、プレーンテキストの後ろにimgタグがある場合、 プレーンテキストにimgタグがはさまれている場合、imgタグが複数ある場合など 汎用的に対応したいのですがうまくできず… アドバイスいただけると助かります。

  • HTMLタグ一括編集

    <a href="URL.***"><img src="URL.***"></a> 上記のタグの場合、***の部分だけをフォルダから一括で連番指定出来るソフトを探しています。 例えば <a href="URL.001.jpg"><img src="URL.001.jpg"></a> ・ ・ ・ <a href="URL.054.jpg"><img src="URL.054.jpg"></a> という風にタグに中に一括で001.jpg~054.jpgだけを入れ替えるソフトです。 よろしくお願いします。

専門家に質問してみよう