Вот моя проблема:
У меня есть текстовое поле, где пользователь может ввести все, что захочет.
Когда он отправляет этот текст (метод 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('#<a href="(?=https:\/\/|http:\/\/)(.*?)">(.*?)</a>#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>
в сущности, или если вы просто хотите удалить код.