2010-11-05 2 views
2

В htmlentities, как я могу выборочно кодировать символы так, чтобы они не кодировали теги < и >, но кодируют ли они &?PHP htmlentities

+2

Вы говорите о ".:;,??"? Если да, зачем их кодировать? Или вы говорите о кавычках? – thejh

+1

1. Никогда не используйте htmlentities. 2. никогда не закодируйте что-нибудь рядом с '<' and '>', '&' и кавычками. –

+2

Правильное решение этой проблемы, скорее всего, будет «Забудьте об объектах кодирования и просто убедитесь, что вы объявляете кодировку символов, которую используете»: http://www.w3.org/International/O-charset – Quentin

ответ

3

Просто используйте:

<?php 
$string = str_replace('&', '&amp;', $string); 

См this подробную информацию о str_replace из официальной документации.

1

попробовать что-то вроде этого:

$string = htmlentities($string); 
$string = str_replace(array('&lt;','&gt;'), array('<', '>'), $string); 

В официальной документации, htmlentities и str_replace

+0

err ... во втором примере вы забыли один параметр – thejh

+0

Вау, и это нужно было отредактировать .. Спасибо. –

+0

@Col Похоже, что исходное сообщение хотело использовать htmlentities для кодирования всего, за исключением < and > –

2

Вы не получаете опцию «частично закодировать»; если есть определенные символы, которые вы хотите экранировать или не сбежать, вам придется делать это вручную. Например, чтобы сделать то, что вы сказать вы хотите:

str_replace('&gt;', '>', str_replace('&lt;', '<', htmlentities($s))) 

Что это вы пытаетесь сделать, правда? Вышеизложенное кажется очень маловероятным. " символы в разметке по-прежнему будут экранированы, изменяя значения атрибутов.

htmlentities также в целом вызывает сомнения, поскольку, если вы специально не подгоняете его правильным аргументом charset, он будет калечить любые символы, отличные от ASCII, в строке в неправильные ссылки на объекты HTML. Обычно лучше использовать htmlspecialchars(), что влияет только на несколько символов, которые действительно являются особыми и нуждаются в ускорении в HTML.

Если вы хотите сделать это, избегайте символа &, вы можете сделать это с помощью простого str_replace('&', '&amp;', $s), но опять же, что все равно заменит амперсанды, которые являются частью допустимой ссылки на объект или символ. Вы уверены, что хотите это сделать? Вы просто пытаетесь исправить неверно используемые неисключенные амперсанды? Если это так, вы можете попробовать регулярное выражение, чтобы выбрать любое использование &, которое не является действительной ссылкой на объект/символ.

Смежные вопросы