Php: удалить все теги, но «a href» в тексте

Вот моя проблема:

У меня есть текстовое поле, где пользователь может ввести все, что захочет.

Когда он отправляет этот текст (метод POST), на стороне сервера я вообще не фильтрую его, прежде чем записывать его в базу данных (потому что я хочу сохранить «неповрежденным» то, что вводил пользователь (возможно, он может быть использован как доказательство он пытался взломать или что-то еще)).

Затем, прежде чем выводить его, я использую эту функцию:

public function textForWeb($texte,$br=true) { if ($br) { return mb_ereg_replace("((\r)?\n)", "<br />", htmlentities( stripslashes($texte), ENT_QUOTES, 'UTF-8' ) ); } else { return htmlentities( stripslashes($texte), ENT_QUOTES, 'UTF-8' ); } } 

Таким образом, текст фильтруется и сохраняется UTF-8 .

Но проблема в том, что мне хотелось бы, чтобы все эти тексты: <a href="http://url">xxx</a> остались нетронутыми. Т.е. когда я его покажу, ссылка (и только ссылки с « http:// » и без javascript внутри ) будет «clickable».

Например, вы можете увидеть, как он отображается здесь . Посмотрите последнюю строку объявления? Я бы хотел, чтобы ссылка на сайт была «интерактивной».

Как бы вы поступили?

Просто добавьте функцию preg_replace (), чтобы вернуть экранированные теги после функции htmlentities ()

 $output = textForWeb($output); $output = preg_replace('#&lt;a href=&quot;(?=https:\/\/|http:\/\/)(.*?)&quot;&gt;(.*?)&lt;/a&gt;#i', '<a href="$1">$2</a>', $output); echo $output; 

Таким образом вы все равно можете избежать всех других HTML безопасным способом (вместо использования функции strip_tags ().)

Эта функция preg_replace () ищет теги, связанные с страницами, начинающимися с http: // или https: //, а затем заменяет экранированные специальные символы с помощью <,> и ", что делает ссылку снова нажатой.

Если вы уверены, что лучше всего использовать strip_tags и установить «a» как допустимый элемент?

Т.е.

 $string = strip_tags($string,'<a>'); 

Это приведет к удалению тегов вместо того, чтобы конвертировать их в свои объекты. Это зависит от того, нужно ли вам преобразовать все, кроме тегов <a> в сущности, или если вы просто хотите удалить код.