Конвертируйте все между <tag></tag> в HTML-энтиты с помощью PHP - PullRequest
2 голосов
/ 15 августа 2011

Как я могу преобразовать каждый тег между тегами в html-сущности:

Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua.
<code class="highlight sql">
    CREATE TABLE `comments`
</code>

<h1>Next step</h1>

Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna aliquyam erat, sed diam voluptua.
At vero eos et accusam et justo duo dolores et ea rebum.
<b>Stet clita kasd gubergren, no sea takimata sanctus</b> est Lorem
dolor sit amet. Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy eirmod tempor invidunt
ut labore et dolore magna aliquyam erat, sed diam voluptua:
<code class="highlight php">
    <?php
        $host = "localhost";
    ?>
</code>

Lorem ipsum dolor sit amet, consetetur sadipscing elitr.

Примечание. Этот пример выше - строка, которую я могу преобразовать в PHP.

Ответы [ 3 ]

2 голосов
/ 20 августа 2011

Это сводится к регулярному выражению для меня. И прежде чем вы начнете кричать, можно надежно сопоставить и заменить подмножества html, если нет вложенных тегов.

Это самый простой способ. Регулярное выражение для соответствия тега начинается до конца и применяет функцию к соответствию / кодированию того, что нам нужно, и заменяет его.

Вот код:

<?php
$string = 'Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et dolore
magna aliquyam erat, sed diam voluptua.
<code class="highlight sql">
    CREATE TABLE `comments`&
</code>

<h1>Next step</h1>

Lorem ipsum dolor sit amet, consetetur sadipscing elitr,
sed diam nonumy eirmod tempor invidunt ut labore et
dolore magna aliquyam erat, sed diam voluptua.
At vero eos et accusam et justo duo dolores et ea rebum.
<b>Stet clita kasd gubergren&, no sea takimata sanctus</b> est Lorem
dolor sit amet. Lorem ipsum dolor sit amet, consetetur
sadipscing elitr, sed diam nonumy " eirmod " tempor invidunt
ut labore et dolore magna aliq&uyam erat, sed diam voluptua:
<code class="highlight php">
    <?php
       * $host = "localhost";
    ?>&
</code>

Lorem ipsum dolor sit amet, consetetur sadipscing elitr.';

echo preg_replace("/(<code[^>]*?>)(.*?)(<\/code>)/se", "
    stripslashes('$1').
    htmlentities(stripslashes('$2')).
    stripslashes('$3')
", $string);

И вот рабочий тестовый пример на кодовой панели

http://codepad.org/MhKwfOQl

Это будет работать до тех пор, пока не появятся неприятные вложенные теги / испорченный html.

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

Если вы хотите заменить другой набор тегов, измените регулярное выражение.

Обновление: Казалось, что $ host был проанализирован php ... и, конечно, мы этого не хотим. Это произошло из-за того, что php оценивает замещающую строку как php, которая затем выполняет заданные функции и вводит найденные строки в эти функции, и если эта строка инкапсулируется двойными qoutes, она также будет анализировать эти строки ... хех, что за хлопоты.

И тогда возникает другая проблема: php избегает одинарных и двойных qoutes в матчах, поэтому они не будут генерировать ошибки синтаксического анализа, поэтому все qoutes в матчах также должны быть удалены из слешей ... что приводит к довольно долгому заменить строку.

1 голос
/ 20 августа 2011

Хотя регулярное выражение или синтаксический анализатор могут дать вам решение этой головоломки, я думаю, что вы, возможно, ошибаетесь в достижении своей цели.

Взято из комментариев ниже вопроса:

@ Poru Как генерируется эта строка?

@ Phil: Получено из базы данных.Это содержание учебника.Это собственная разработка "CMS".

Если вы храните эту строку в базе данных, и ее функция - возвращать контент HTML, вы должны хранить контент, готовый служить HTML, что означаетвы должны экранировать соответствующие символы с их эквивалентными объектами HTML.

Это был совет, который уже был предложен вам в этом вопросе: https://stackoverflow.com/questions/7059776/include-source-code-in-html-valid/7059834

Символы, которые должны быть экранированы, описаны здесь (средидругие ссылки):

http://php.net/manual/en/function.htmlspecialchars.php

Выполнены следующие переводы:

  • '&' (амперсанд) становится '&amp;'
  • '"' (двойная кавычка) становится '&quot;', когда ENT_NOQUOTES не установлен.
  • " '"(одинарная кавычка) становится '&#039;', только если установлен ENT_QUOTES.
  • '<'(меньше чем) становится <code>'&lt;'
  • '> '(больше чем) становится '&gt;'

Если на самом деле это так, и эта строкаПредполагается, что это вывод HTML и не имеет никакой другой функции, нет смысла сохранять его какневерный HTML или, по крайней мере, не тот, который вы намереваетесь.

Если вы должны хранить примеры кода без экранирования, рассмотрите отдельную таблицу базы данных для этих фрагментов и просто запустите htmlspecialchars() на них перед выводом в HTML-документ.Вы даже можете назначить язык для каждой записи и использовать соответствующий инструмент подсветки синтаксиса для каждого случая автоматически.

То, что вы пытаетесь, на мой взгляд, не является подходящим решением этой конкретной проблемы, в этом контексте,Экранирование символов и подготовка вашего HTML-контента к выводу на экран в его текущей форме - вот путь.

0 голосов
/ 20 августа 2011
$dom = new DOMDocument;
$dom->loadHTML(...);

$tags = $dom->getElementsByTagName('tag');
foreach($tags as $tag) {
    $tag->nodeValue = htmlentities($tag->nodeValue);
}
$dom->saveHTML();
...