Я думаю, что лучшим решением является их декодирование в первую очередь. Обычный &
останется нетронутым, но &
будет декодирован до &
.
Затем закодируйте их снова, чтобы преобразовать &
и другие специальные символы в их закодированный эквивалент. Код короче объяснения. :)
$text = 'Your text with &s from the database';
// Decode and re-encode the special characters.
$text = htmlspecialchars(htmlspecialchars_decode($text));
Если у вас есть другие объекты в там же (как é
для é
), вместо htmlspecialchars
, вы можете также использовать htmlentities
и html_entity_decode
. Решение такое же, но вы можете проверить, какой из них дает лучший результат для вас.
$text = 'Your text with &s from the database';
// Decode and re-encode the special characters and other entities.
$text = htmlentities(html_entity_decode($text));
Оба htmlspecialchars
и htmlentities
поддерживают параметр doubleencode
, что верно по умолчанию, но может быть установлен в ложь. Это также должно предотвращать двойное кодирование. Похоже, это решение еще чище, но я не использовал его, и я не знаю, есть ли у него какие-либо побочные эффекты.
Этот вопрос очень запутан. У вас есть данные в базе данных, содержащей '&', вы используете 'htmlspecialchars()', чтобы превратить их в объекты HTML, но есть и другие записи в базе данных, которые имеют '&', но вы не хотите, чтобы эти конкретные записи чтобы их '&' преобразован 'htmlspecialchars()' ??? – Ohgodwhy
Вы, скорее всего, захотите использовать регулярное выражение для выполнения этого. Возможно, что-то вроде '& (?! amp;)' должно идентифицировать «голые» амперсанды. – CollinD
@ohgodwhy У него есть смесь данных. Некоторые безопасны для html, некоторые нет. Он просит просто очистить голые амперсанды, но не амперсанды, которые уже экранизированы как '&' – CollinD