PHP конвертировать строки в htmlentities - PullRequest
0 голосов
/ 03 апреля 2011

Как преобразовать код внутри тегов <code> и <pre> в html-объекты?

<code><code class="php"> <div> a div.. </div> </code>

<pre class="php">
<div> a div.. </div>
, это следует игнорировать

Ответы [ 4 ]

2 голосов
/ 03 апреля 2011

ОК, я играл с этим некоторое время.Результат может быть не самым лучшим или самым прямым решением (и, честно говоря, я полностью не согласен с вашим подходом, если произвольные пользователи будут отправлять входные данные), но, похоже, он «работает».И, самое главное, он не использует регулярные выражения для анализа XML.:)

Подделка ввода

<code><?php

$str = <<<EOF
<code class="php"> <div> a div.. </div> </code>

<pre class="php">
<div> a div.. </div>
, это следует игнорировать
EOF;?>

Код

<?php

function recurse(&$doc, &$parent) {
   if (!$parent->hasChildNodes())
      return;

   foreach ($parent->childNodes as $elm) {

      if ($elm->nodeName == "code" || $elm->nodeName == "pre") {
         $content = '';
         while ($elm->hasChildNodes()) { // `for` breaks the `removeChild`
             $child = $elm->childNodes->item(0);
             $content .= $doc->saveXML($child);
             $elm->removeChild($child);
         }
         $elm->appendChild($doc->createTextNode($content));
      }
      else {
         recurse($doc, $elm);
      }
   }
}

// Load in the DOM (remembering that XML requires one root node)
$doc = new DOMDocument();
$doc->loadXML("<document>" . $str . "</document>");

// Iterate the DOM, finding <code /> and <pre /> tags:
recurse($doc, $doc->documentElement);

// Output the result
foreach ($doc->childNodes->item(0)->childNodes as $node) {
   echo $doc->saveXML($node);
}

?>

Выход

<code><code class="php"> &lt;div&gt; a div.. &lt;/div&gt; </code>

<pre class="php">
&lt;div&gt; a div.. &lt;/div&gt;
это следует игнорировать

Доказательство

Вы можете видеть, как оно работает здесь .

Обратите внимание, что оно не вызывает явно htmlspecialchars;DOMDocument объект обрабатывает сам побег.

Надеюсь, это поможет.:)

2 голосов
/ 03 апреля 2011

Вы можете использовать jquery. Это закодирует что угодно внутри любых тегов с классом code.

$(".code").each(
    function () {
        $(this).text($(this).html()).html();
    }
);

Скрипка: http://jsfiddle.net/mazzzzz/qnbLL/

2 голосов
/ 03 апреля 2011

PHP

if(preg_match_all('#\<(code|pre) class\=\"php\"\>(.*?)\</(code|pre)\>#is', $html, $code)){
    unset($code[0]);
    foreach($code as $array){
        foreach($array as $value){
            $html = str_replace($value, htmlentities($value, ENT_QUOTES), $html);
        }
    }
}

HTML

<code><code class="php"> &lt;div&gt; a div.. &lt;/div&gt; </code>

<pre class="php">
&lt;div&gt; a div.. &lt;/div&gt;
это следует игнорировать

Вы когда-нибудь слышали о коде BB?http://en.wikipedia.org/wiki/BBCode

1 голос
/ 03 апреля 2011

Это несколько связано, вам не нужно использовать Geshi, но я написал здесь немного кода Советы по реализации простого регулярного выражения (для разбора bbcode / geshi) , который поможет вам решить проблему.

Это может быть изменено, чтобы не использовать GeSHi, просто потребуется немного повозиться.Надеюсь, это поможет вам.

...