htmlspecialchars не работает внутри data-content - PullRequest
0 голосов
/ 16 мая 2018

Я использую bootstrap select для отображения категорий, и я очищаю эти категории с помощью htmlspecialchars, но по какой-то причине, когда он находится внутри атрибута data-content, он не работает, потому что у меня есть категория, и браузер интерпретирует ее как имеет реальный HTML-тег, а не строку. Я пытался использовать htmlentitites, но он тоже не работает ... У меня также есть хотя и об использовании urlencode, но так как я использую выбор начальной загрузки, я не знаю, где его кодировать ...

Вот мой код:

"<option value='$row[id]' data-content='<span class=\"glyphicon glyphicon-stop\" 
style=\"color:$row[cor]\"></span> <span style=\"text-align:left\"> 
".htmlspecialchars("$row[nome]",ENT_QUOTES)." 
</span>'>".htmlspecialchars("$row[nome]",ENT_QUOTES)."</option>";

Как вы можете видеть, все категории отображаются (они имеют странные имена для целей тестирования), но последняя с именем </a> не отображается, и вы можете увидеть в источнике </a> интерпретируется как html, а не как строка, как другие имена категорий

Спасибо!

1 Ответ

0 голосов
/ 16 мая 2018

A < интерпретируется как начало тега HTML.
&lt; - это HTML-кодированная сущность, которая будет интерпретироваться как символ «<». </p>

Если вы помещаете в атрибут что-то, похожее на HTML, вам нужно кодировать его HTML, чтобы не нарушить атрибут HTML. Например, атрибут окружен кавычками, если вы хотите, чтобы внутри атрибута были кавычки в качестве значения, которое должно быть &quot;:

attribute="&quot;value&quot;"

использует значение атрибута data-content как HTML.
Так что data-content="&lt;span&gt;" в конечном итоге станет HTML-элементом <span>.

Если вы хотите, чтобы он заканчивался текстом "", вам нужно предоставить HTML, который отображает текст "", то есть &lt;span&gt;. Поскольку вы помещаете это в атрибут HTML, вам необходимо кодировать HTML , в:

data-content="&amp;lt;span&amp;gt;"

☝️ Это правильное значение в кодировке HTML (потому что оно в атрибуте) &lt;span&gt;, которое при интерпретации как HTML (как будет делать ) будет отображаться как текст "».

Итак:

$attrTemplate = '<span class="glyphicon glyphicon-stop" style="color:%s"></span>
                 <span style="text-align:left">%s</span>';
$attr = sprintf($attrTemplate, htmlspecialchars($row['cor']), htmlspecialchars($row['nome']));

$optionTemplate = '<option value="%s" data-content="%s">%s</option>';
printf($optionTemplate, htmlspecialchars($row['id']), htmlspecialchars($attr), htmlspecialchars($row['nome']));

Как видите, все, что входит в HTML, и которое вы хотите сохранить как есть, должно быть закодировано в HTML (здесь используется htmlspecialchars).

Также см. Великий эскапизм (или: что нужно знать, чтобы работать с текстом внутри текста) .

...