正規表現でHTMLタグの属性まで選んで抽出

このQ&Aのポイント
  • PHPを使用して掲示板を作成していますが、文字列の無効化と許可タグの分別に正規表現を使用したいです。
  • 現在、< > を特殊文字に変換してから、許可タグの属性を元に戻そうとしています。
  • 例えば、fontタグのcolorとsizeを許可するための正規表現を作成しましたが、上手く機能しません。
回答を見る
  • ベストアンサー

正規表現でHTMLタグの属性まで選んで抽出

現在、掲示板をPHPで作っています。 入力された文字列の無効化と許可タグの分別に正規表現を使いたいと考えております。 そこで、現状では、まずすべての < > を特殊文字に変換し、その後に、許可タグ(属性)のタグを < > にもどそうとしています。 たとえば、fontタグならcolorとsizeを許可しようとして、次のような正規表現を作ってみましたが、うまくいきません。 /&lt;font((( )*(color=)[\"\']?.{1,7}[\"\']?)|(( )*(size=)[\"\']?.{1,2}[\"\']?))*&gt;/i 正規表現はまだ勉強し始めたところで、おかしなところだらけだと思いますが、何かヒントだけでもいただけたらと思います。 どうぞよろしくお願いします。

  • SHlVA
  • お礼率92% (60/65)
  • PHP
  • 回答数1
  • ありがとう数1

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

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

$extention[] = "/&lt;(font(?:(?: color=[\"\']?(?:&quot;)?[#0-9a-z]{1,20}[\"\']?(?:&quot;)?)?|(?: size=[\"\']?(?:&quot;)?[\d]{1,2}[\"\']?(?:&quot;)?)?)*)&gt;/i"; $extention[] = "#&lt;(/font)&gt;#i"; foreach($extention as $ext){ $tag = preg_replace($ext,"<$1>",$tag); } こんなのはどうでしょうか。 多分" や 'が&quot;になってるんじゃないかな?と思います。 勘ですが。

SHlVA
質問者

お礼

お礼が遅くなってしまい申し訳ございませんでした。 ご教示いただいたとおり試してみますと、キッチリしていした属性の時のみ処理できるようになりました。 しかし、下記のように $tag = "<font size=10 color='red'>テスト</font>"; $tag = str_replace(array("<",">"),array("/&lt;","&gt;#i"),$tag); foreach($extention as $ext){ $tag = preg_replace($ext,"<$1>",$tag); } print $tag; とすると、結果が /<font size=10 color='red'>#iテスト/</font>#i と、タグの前後に / #i がついてしまうのです。 勉強不足で試行錯誤を繰り返しているのですが、 2つ目の正規表現のデリミタ部分にある # は何を表しているのでしょうか? これを / に変えるとエラーとなってしまいます。

SHlVA
質問者

補足

試行錯誤の末、なんとかできるようになりました。 アドバイスありがとうございました。

関連するQ&A

  • またまた正規表現><

    いつもお世話になっておりますっ>< 正規表現の記述方法で質問があります。 (納期に追われております><) たとえば <font color=#FFFFFF size=6> みたいな文字があってこれを <font color="#FFFFFF" size="6"> に変えたいんです。つまり「=」の後ろに ダブルクォーテーションがなかったら ダブルクォーテーションを付けたいんです>< さらに <font color="#FFFFFF" size=5> とか、ちゃんとダブルクォーテーションが着いてる文字列も混在しております>< 最終的には = のあとにダブルクォーテーション で その後に続く文字を 囲いたいんです>< 正規表現については以前質問したんですが、 申し訳ありません、また教えてください、よろしくお願い致します><

  • HTMLのタグの属性に、普通使わないものを使うことはできますか?

    HTMLのタグの属性に、普通使わないものを使うことはできますか? HTMLにはあるタグでは使う属性も他のタグでは使わないタグがたくさんあります 例えば、fontタグでは属性としてcolorなどを使えますが、divに使っても何もおきません これを利用してHTMLファイルをjavascriptでパースする時の条件判別に利用しようと考えたのですが、こういった使い方はしてもよいものなのでしょうか? 質問が分かりにくいかもしれませんが、分かる方よろしくおねがいします。

    • ベストアンサー
    • HTML
  • HTMLタグの入れ方

    こんばんは。HTMLタグの入れ方?について質問があります。例えば、文字のサイズや色のサイズを変更するときには<font size="1">や<font color="red">などを指定することで出来ると思います。このタグなんですが、<font size=1>や<font color=red>のようにダブルクォーテーションを使わなくても大丈夫なのでしょうか?当方、携帯サイトを運営しているので、少しでもタグを減らしたいと考えてこの質問をしました。よろしくお願いします。

  • PHPの正規表現の利用

    今現在、PHPの掲示板を作っています^^ そこで、最近携帯の掲示板よく見かけるようになった#+文字(#あいうえお)で文字の色を変えるやつを自分の掲示板にも付けようと思いました。 単純な話、 #あいうえお(ここに改行があります) などをレスの中から見つけ出し下記のようにすることです。 <font color="red">#あいうえお</font> いろいろ調べていった結果、正規表現を使えばよいということがわかりました! いろいろと試しましたが全くできませんでした(T_T) どなたか正規表現に詳しい方教えてください(^^♪

    • ベストアンサー
    • PHP
  • <  タグの事で・・・

    <Font Color="#ff0000">などと色を変えるタグがありますよね? それの<や>の部分の事で・・・ <=<、&lt  >=>、&gt などとあるんですが、それが無効なので、他の方法は無いでしょうか? よろしければ教えてください。 お願いします。 (ちなみにそのオンラインゲームはタグ禁止ではありません)

  • 【正規表現】HTML5のpattern属性について

    HTML5のpattern属性で半角英数記号を指定するにはどう記述したら良いですか? HTMLやCSSの学習をしています。 正規表現についてはほぼ分かりません。 (1)ユーザーIDやパスワード入力フォーム半角英数記号のみの入力を処理する場合、type属性は”text”でいいのでしょうか? (2)pattern 属性に使う正規表現はほぼ理解できません。自分なりに調べてみたのですが、以下のような記述だと_アンダーバーや@マークなどの記号は識別できないのではないかと言われました。 また入力文字数制限は正規表現でも出来るようですが、以下のように自分でもわかるminlength, maxlengthで記述しようと思っていまがこれで大丈夫なのでしょうか? サンプルとして以下のように記述してみました。 type属性や、「半角英数記号」の入力文字など正しい書き方を教えてください。 よろしくお願いします。 <input type="text" name="username" pattern="^[0-9A-Za-z]+$" minlength="4" maxlength="50">

  • サニタイジング化されてしまったクォーテーションの復活

    Javaで掲示板を作成しております。 入力された内容をタグがあれば正規表現によりサニタイジング化しています。 <font size="5" color="red">TEST"test"</font> → &lt;font size=&quot;5&quot; color=&quot;red&quot;&gt;TEST&quot;test&quot;&lt;/font&gt; 許可したタグは復活させています。 → <font size=&quot;5&quot; color=&quot;red&quot;>TEST&quot;test&quot;</font> ここで質問なのですが、 「&quot;5&quot;」と「&quot;red&quot;」のダブルクォーテーションを 復活させて「"5"」と「"red"」となるように、 また、「&quot;test&quot;」は復活させないようにするにはどういう方法が御座いますでしょうか? できれば、 <font size="5" color="red">TEST1"test1"</font> <font size="6" color="blue">TEST2"test2"</font> <font size="7" color="yellow">TEST3"test3"</font> がまとめて置換できればと思います。 宜しく御願いいたします。

    • ベストアンサー
    • Java
  • 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
  • HTMLのタグ属性で指定された特定文字列を置換する

    HTMLで、開始 < と終了 > に囲まれた特定の文字列を別の文字に書き替えたいのですが、思う通りに動かなくて困っており、質問させていただきます。 例えば以下の2行のHTMLがあったとします。  <font color="red">赤は英語でredです。</font>  <span style="color:red;">赤は英語でredです。</span> このHTMLで、タグの属性として使われている「color="red"」と「style="color:red;"」の部分だけ「red」を「black」に変更したいのです。 (文字列として使われている「英語でredです」の部分はそのまま) 秀丸やさくらエディタで正規表現を使って検索すると、 <.+?red.+?> で検索できましたがJavaでは検索ができません・・・。 コード: String strHtml = "<html><body><font color=\"red\">赤は英語でredです。</font><span style=\"color:red;\">赤は英語でredです。</span></body></html>"; Pattern pattern = Pattern.compile( "<.+?red.+?>", Pattern.DOTALL ); // 正規表現で検索 Matcher matcher = pattern.matcher( strHtml ); while( matcher.find() ){ System.out.println( "res=" + matcher.group( 0 ) ); } 出力結果: res=<html><body><font color="red"> res=</font><span style="color:red;"> res=<html><body><font color="red">赤は英語でredです。</font><span style="color:red;">赤は英語でredです。</span></body></html> エディタと同じように<font color="red">と<span style="color:red;">が取りたいのですが・・・、考え方もしくは正規表現が間違っているのでしょうか? お分かりの方がいましたら御助力いただけたら助かります。 よろしくお願いします。

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

    Htmlのタグの属性を正規表現を用いて取得しようとしています。 たとえば <font size="2" face="MS 明朝"> の場合、 "2"と "MS 明朝" を取得したいのですが、 以下のように定義を "="から始まり、空白か">"迄と定義した所、 pattern = Pattern.compile("=(.*?)[ >]"); としてマッチングした所、 "2"と "MS がとれてしまいました。 "(ダブルクォーテーションの中の[ >](空白等)は判定しないような 定義に出来るのでしょうか。 宜しくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう