• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現でHTMLタグの属性まで選んで抽出)

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

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

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

  • ベストアンサー
回答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