htmlspecialchars и теги

Samail
На сайте с 10.05.2007
Offline
369
593

Мне нужно заменять & на &

$str= preg_replace('/&/', '&', $str);

Меняет, но если в строке уже есть & то получается &

htmlspecialchars меняет & нормально, но заодно преобразует и символы < > и тег портится. Как заменять & только когда он не является частью HTML сущности или использовать htmlspecialchars не ломая тег?

Joker-jar
На сайте с 26.08.2010
Offline
167
#1

Разве htmlspecialchars не делает &amp; -> &amp;amp; ?

Samail
На сайте с 10.05.2007
Offline
369
#2

Так он заодно преобразует '<' в '&lt;' и теги становятся не тегами, а просто текстом.

Joker-jar
На сайте с 26.08.2010
Offline
167
#3

А если по существу, то почему бы не воспользоваться более подходящими для таких задач инструментами, например:

<?php

$str = 'Test & test &amp; test';

$replace_pairs = array('&amp;' => '&amp;', '&' => '&amp;');

echo strtr($str, $replace_pairs);

?>

Дополнив массив замен другими сущностями, которые нужно оставлять неизменными, при необходимости.

Samail
На сайте с 10.05.2007
Offline
369
#4
Joker-jar:
Дополнив массив замен другими сущностями, которые нужно оставлять неизменными, при необходимости.

Их наверное все нужно неизменными оставлять,

---------- Добавлено 30.11.2016 в 20:30 ----------

Пришла мысль сначала преобразовывать сущности в символы, а потом уже заменять.


$str = html_entity_decode($str);
$str = preg_replace('/&/', '&amp;', $str);
богоносец
На сайте с 30.01.2007
Offline
769
#5

Но потом-то опять надо символы в сущности превратить, как завещала параноя.XSS

Samail
На сайте с 10.05.2007
Offline
369
#6

богоносец, нет, мне только один спецсимвол преобразовать нужно, остальные экранировать.

Russ1an
На сайте с 25.03.2015
Offline
84
#7

Заменить сначала все &amp; на & а потом & на &amp;

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий