• ベストアンサー

正規表現でHTMLを変換したい

HTMLファイルの特定のタグだけを分析して、独自の形に変換したいと思っています。 $html = preg_replace('/<div( [^>]*)?>(?!.*<div[^>]*)(.*?)<\/div>/is', '<div2 \1 value='\2' />', $html); 例えばこんな風にdivタグを分析すればある程度欲しいデータは取得する事が出来るのですが、 ただ単にこれだけだと、一番最後に出てくる一番深いdiv要素の所しか取得出来ません。 うまい事divの組合せ全てを変換する方法は無い物でしょうか

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

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

  • ベストアンサー
回答No.2

http://digit.que.ne.jp/work/wiki.cgi?PHP%E3%83%A1%E3%83%A2%2FHTML%E3%81%AE%E8%A7%A3%E6%9E%90 こちらのブログで、HTMLをパースする関数が公開されております。 この関数は、正規表現を用い、全ての要素を配列に展開します。 展開された配列を再度foreachなどでループさせつつ、必要なタグの部分だけ、if文で振り分けて変換してから出力してやれば、やりたいことが行えると思います。

その他の回答 (1)

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

<?PHP $html=<<<eof <div>hoge0</div> <div id="id1">hoge1</div> <div id="id2">hoge2</div> <div id="id3">hoge3</div> eof; $pattern='/<div(?: *?)(.*?)>(.*?)<\/div>/is'; $replacement='<div2 \1 value=\'\2\' />'; /* //debug $replacement=htmlspecialchars($replacement); */ $html = preg_replace($pattern,$replacement , $html); print $html; ?>

関連するQ&A

  • 正規表現で、指定文字から指定文字までを削除したい

    <div class="post-image-border">○○○○</div> をタグ毎削除したいのですが、どうすればよいでしょうか? $data = preg_replace("#\<div class=\"post-image-border\"\>.*\<\/div\>#","",$data); とやってみたのですが、うまくいきませんでした

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

    お世話になります。 ereg_replace で書いた正規表現による置換処理を、 preg_replace に置き換えようとしています。 (preg_replaceの方が処理が速いとマニュアルにあったので) ところが、preg_replaceでの正規表現検索がうまくいかないで困っています。 基本的には、ereg_replaceの正規表現部分を//で囲んでいるだけです。 具体的には、下記のような処理を書いています。 間違いがあれば、ご指摘いただけましたら幸いです。 //### うまくいっている ereg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='\{dokuji tag\}.+\{_dokuji tag\}'; $replace=''; $html=ereg_replace($search,$replace,$html); //不要部分の削除 //### うまくいっている ereg_replace のパターン ここまで ### ↓ //### うまくいかない preg_replace のパターン ここから ### $html=file_get_contents('template/temple.html'); //ひな形読み込み $search='/\{dokuji tag\}.+\{_dokuji tag\}/m'; $replace=''; $html=preg_replace($search,$replace,$html); //不要部分の削除 //### うまくいかない preg_replace のパターン ここまで ### //### 置き換えるソース('template/temple.html') ここから ### <!-- {dokuji tag} --> <tr> <td nowrap><strong>タイトル:</strong></td> <td> <input type="text" name="name" size="80" value="{name}" /> </td> </tr> <!-- {_dokuji tag} --> //### 置き換えるソース('template/temple.html') ここまで ### よろしくお願い申し上げます。

    • ベストアンサー
    • PHP
  • 正規表現でpreg_系を使ってタグ内は置き換えないようにする方法

    正規表現でpreg_系を使って、半角スペースを&nbsp;に置き換える処理をしたのですが、タグ内のスペースも&nbs;に置き換わってしましました。 タグ内は置き換えないようにするにはどのようにしたら良いでしょうか? データは複数行渡っています。以下はタグが置き換わるので、逆にタグでないものを置き換えたいです。 <?php function test_call($matches){ return str_replace(" ","&nbsp;",$matches[0]); } $data = <<< EOT この横は変換 します。 <a href="http://www.yahoo.co.jp/" target="_blank">タグの半角スペースは変換せず、 この横は変換する。 </a> このタグも変換してはいけません。< br/> EOT; $data = preg_replace_callback('/<("[^"]*"|\'[^\']*\'|[^>])*>[ ]?/', "test_call", $data); var_dump($data); ?>

    • ベストアンサー
    • PHP
  • preg_replaceでの正規表現による空行削除

    <p>タグ部分だけを抜き出し除去したhtmlを出力表示したのですが、 HTMLソース内に<p>タグを抜き出した部分に3行づつ空白があきます。 どうしても解決できません。助けて下さい。 ちなみに、<p>ではなくHTMLコメントタグとして <!--ここから-->タグか文章<!--ここまで-->と表現する場合も教えて下さい。 ---------------------------------------------------- $contents = <<<_HTML_ <div>DIVエリア/NO.1 <h1>1行目のH1タグ</h1> <h2>2行目のH2タグ</h2> <h3>3行目のH3タグ</h3> <p>4行目Pタグ</p> <p>5行目Pタグ</p> <p>6行目Pタグ</p> </div> <div>DIVエリア/NO.2 <h1>1行目のH1タグ</h1> <h2>2行目のH2タグ</h2> <h3>3行目のH3タグ</h3> <p>4行目Pタグ</p> <p>5行目Pタグ</p> <p>6行目Pタグ</p> </div> _HTML_; echo preg_replace(\'!<p>.*?</p>\\n*!i\', \'\', $contents); -----------------------------------------------------

    • ベストアンサー
    • PHP
  • 正規表現で指定範囲すべて除去する方法

    正規表現で {○○○○}の中を全て除去する場合 echo preg_replace('/{.*?}/', '', $html); で{ 文字は除去できる }の中が全て文字だけの場合は除去できるのですが、 { <div>タグを含むと除去できないので困っています</div> }とすると echoした場合に{ <div>タグを含むと文字も除去できな、すべて表示</div> }はそれごとすべてHTML表示されます。 { }内の{}やタグ、文字を全て除去する正規表現はどうすればよいのでしょうか? --------------------------------------------------- $html= <<<_EOD_ <HTML> <HEAD> <title>ここにページタイトルを記述する</title> </HEAD> <BODY> <p>ここの文章は表示する</p> { <div>ここにエリアは表示しない</div> } </BODY> </HTML> _EOD_; echo preg_replace('/{.*?}/', '', $html); -------------------------------------------------------------

    • 締切済み
    • PHP
  • 正規表現

    分かりづらい質問で申し訳ありませんが、PHPの正規表現で教えて下さい。 現在下記のような文字列があります。 見やすく改行しましたが、本来は改行はなく、1行です。 最初にPタグがあり、次に複数のクラスが付いたdiv(これを①とします)、同じく複数のクラスが付いたdivタグ(これを②とします)があるような構造です。 このdivタグの中にはfigureタグ、その中にimg タグがあります。 ②番目のdivの中のimgのsrcには特定の文字列があります。 この特定の文字列を含む親のdivタグ全体を抜き出す正規表現を書きたいと思っています。 つまり、正規表現の結果下記部分が抽出できればと思います(これを「正解」とします)。 <div class="(省略)"> <figure> <img src="{特定の文字列}"> </figure> </div> 現在このように記述しましたが、①、②全てのdivが取得されてしまっている状態です。 「/<div class="se-component se-image-container __se__float-none" contenteditable="false">(?>).*<\/div>/i」 これを「正解」のように抽出するにはどのような正規表現になるのでししょうか? よろしく御願い致します。 <p>ghoge</p> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="data:image/jpeg;base64,/9j/4AA" alt="" data-rotate=""> </figure> </div> <div class="se-component se-image-container __se__float-none" contenteditable="false"> <figure style="margin: 0px;"><img src="{特定の文字列}" alt="" data-rotate=""> </figure> </div>

    • ベストアンサー
    • PHP
  • 正規表現 URLのリンク

    $value = 'http://www.google.co.jp http://www.google.co.jp'; $screen = substr($value, 0, 40); $strVal = preg_replace("/http.?:\/\/([0-9a-zA-Z\-\.!~\/?:;=+,%#_])+/","<a href=\"\\0\" target=\"_blank\">\\0</a>", $screen); echo $strVal; とした場合 <a href='http://www.google.co.jp'>http://www.google.co.jp</a> <a href='http://www.googl'>http://www.googl</a> となってしまうのですが、これを2つ目は切れているので、末尾でヒットした場合にはAタグは付けないようにしたいのですが、できますでしょうか?

    • 締切済み
    • PHP
  • HTMLの許可

    プログラム初心者です 簡単な掲示板を作りました 一部のHTMLのタグを許可する方法を教えてください 素人なりに考えたのですが、一回タグをすべて無効化して&lt;code&gt;にしてから許可したいタグにマッチした文字だけをHTMLにすればどうかなと思ったんです 質問1 これで、セキュリティ的に安全ですか? 質問2 10個くらいのタグを置き換えると負荷は重そうですか?メッセは最大2000文字程度です <?PHP $mes//投稿されたメッセ(タグは除去済み) $pattern="/&lt;code&gt;/"; $replacement="<code>"; preg_replace($pattern,$replacement,$mes); $pattern="/&lt;/code&gt;/"; $replacement="</code>"; preg_replace($pattern,$replacement,$mes); ?> 許可したいタグは、b、code、tableなどのタグなどです 質問3 もっと他にいい方法があればお願いします よろしくお願いします

    • ベストアンサー
    • PHP
  • 正規表現文字列をDB登録

    正規表現に詳しくないことと、PHPも携わったばかりなので、苦戦しています。ご教授いただけると助かります。 以下のようなことをやろうとしています。 1.フォームで入力された正規表現を文字列としてDBに登録していきます。 例{http://[w-.]*test_site.jp}i 2.登録データを取り出して、preg_replace()を使いたいです $url_text = {http://[\w\-.]*test_site\.jp}i $db_data ←1のデータ(配列になってます) preg_replace($db_data, '', $url_text, -1) そうすると、$db_dataの中身は\がないために、エラーとなります。 Warning: preg_replace(): Compilation failed: range out of order in character class at offset 10 DBから取得した後に、変換するような関数などあるんでしょうか。 それとも他の方法を探したほうがよいのでしょうか。 一致したものを省きたいような処理なのですが・・・。 ためしにpreg_quote()をかけてみましたが変な風に置換されてダメでした。 うまく説明もできなくて申し訳ないですが、何か良い案ありますでしょうか。 必要であれば、補足いたします。 ぜひお願いいたします。

    • ベストアンサー
    • PHP
  • [正規表現][入れ子]ネストされたリストをインデントに置換したい

    [正規表現][入れ子]ネストされたリストをインデントに置換したい preg_replaceかpreg_replace_callbackを使って、 ネストされたリストタグを全角空白によるインデントに書き換えたく思っています。 (携帯表示するため) 1階層目のliならインデントひとつ。 2階層目のliならインデントふたつ。 ・ ・ ・ という具合にしたいのです。 以下は全角空白をわかりやすくするために□で置き換えました。 ---------------------------------------------------------------------------- 【現在のHTML】 文章1 文章2 <ul>  <li>リストA</li>  <li>リストB</li>  <li>リストC</li> </ul> <ul>  <li>   <ul>    <li>リストあ</li>    <li>リストい</li>    <li>リストう</li>   </ul>  </li> </ul> ---------------------------------------------------------------------------- 【置換完了後のブラウザ表示】 文章1 文章2 □リストA □リストB □リストC □□リストあ □□リストい □□リストう ---------------------------------------------------------------------------- 【置換完了後のHTMLのイメージ】 文章1 文章2 <div>  <div>□リストA</div>  <div>□リストB</div>  <div>□リストC</div> </div> <div>  <div>   <div>    <div>□□リストあ</div>    <div>□□リストい</div>    <div>□□リストう</div>   </div>  </div> </div> ---------------------------------------------------------------------------- どうぞ、よろしくお願い致します。

    • ベストアンサー
    • PHP

専門家に質問してみよう