かもメモ

自分の落ちた落とし穴に何度も落ちる人のメモ帳

PHP aタグだけ除去したい。

aタグで囲っているコンテンツの中に、管理画面のWYSIWYGエディターなどでユーザーが入力したHTMLのを出力する時、出力するHTMLの中にaタグが含まれていると、リンクが壊れてしまいます。

[参考]

なので、aタグだけを除去して出力したい!
PHPではstrip_tagsという関数でHTMLのタグを除去できるのですが、この関数は許可するタグ(取り除かないタグ)は第二引数で選択できるのですが、特定のタグだけを除去したい場合はちょっと大変です。

preg_replace でaタグだけ除去する。

正規表現を使いますよね。。。苦手

aタグとaタグで囲まれている文字列を消去

<?php
// 入力されているHTML  
$html = '<p>出力されるHTMLです。
<a href="#">ここにリンクが有ります。</a>
ここからはリンクではありません。</p>';

$content = preg_replace('/<a .*?>(.*?)<\/a>/', "", $html);

echo $content;
/* =>
<p>出力されるHTMLです。

ここからはリンクではありません。</p>
*/

aタグだけを除去

<?php
// 入力されているHTML  
$html = '<p>出力されるHTMLです。
<a href="#">ここにリンクが有ります。</a>
ここからはリンクではありません。</p>';

$content = preg_replace('/<a .*?>(.*?)<\/a>/', "$1", $html);

echo $content;
/* =>
<p>出力されるHTMLです。
ここにリンクが有ります。
ここからはリンクではありません。</p>
*/

strip_tagsに除去するタグだけ指定できるオプションがほしい。


[参考]

プログラミングPHP 第3版

プログラミングPHP 第3版