- ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:正規表現でHTMLタグの属性まで選んで抽出)
正規表現でHTMLタグの属性まで選んで抽出
このQ&Aのポイント
- PHPを使用して掲示板を作成していますが、文字列の無効化と許可タグの分別に正規表現を使用したいです。
- 現在、< > を特殊文字に変換してから、許可タグの属性を元に戻そうとしています。
- 例えば、fontタグのcolorとsizeを許可するための正規表現を作成しましたが、上手く機能しません。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
$extention[] = "/<(font(?:(?: color=[\"\']?(?:")?[#0-9a-z]{1,20}[\"\']?(?:")?)?|(?: size=[\"\']?(?:")?[\d]{1,2}[\"\']?(?:")?)?)*)>/i"; $extention[] = "#<(/font)>#i"; foreach($extention as $ext){ $tag = preg_replace($ext,"<$1>",$tag); } こんなのはどうでしょうか。 多分" や 'が"になってるんじゃないかな?と思います。 勘ですが。
お礼
お礼が遅くなってしまい申し訳ございませんでした。 ご教示いただいたとおり試してみますと、キッチリしていした属性の時のみ処理できるようになりました。 しかし、下記のように $tag = "<font size=10 color='red'>テスト</font>"; $tag = str_replace(array("<",">"),array("/<",">#i"),$tag); foreach($extention as $ext){ $tag = preg_replace($ext,"<$1>",$tag); } print $tag; とすると、結果が /<font size=10 color='red'>#iテスト/</font>#i と、タグの前後に / #i がついてしまうのです。 勉強不足で試行錯誤を繰り返しているのですが、 2つ目の正規表現のデリミタ部分にある # は何を表しているのでしょうか? これを / に変えるとエラーとなってしまいます。
補足
試行錯誤の末、なんとかできるようになりました。 アドバイスありがとうございました。