Как я могу преобразовать код внутри тегов <code>
и <pre>
в объекты html?
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
Как я могу преобразовать код внутри тегов <code>
и <pre>
в объекты html?
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
Хорошо, я играл с этим некоторое время. Результат может быть не самым лучшим или самым прямым решением (и, честно говоря, я полностью не согласен с вашим подходом, если произвольные пользователи собираются отправлять входные данные), но, похоже, он «работает». И, самое главное, он не использует регулярные выражения для разбора XML. :)
Фальсификация ввода
<?php
$str = <<<EOF
<code class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </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 class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
Доказательство
Вы можете увидеть, как это работает здесь.
Обратите внимание, что он не вызывает явно htmlspecialchars
; объект DOMDocument
сам обрабатывает экранирование.
Я надеюсь, что это помогает. :)
Вы можете использовать jQuery. Это будет кодировать что-либо внутри любых тегов с классом code
.
$(".code").each(
function () {
$(this).text($(this).html()).html();
}
);
Скрипка: http://jsfiddle.net/mazzzzz/qnbLL/
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 class="php"> <div> a div.. </div> </code>
<pre class="php">
<div> a div.. </div>
</pre>
<div> this should be ignored </div>
Вы когда-нибудь слышали о BB-коде? http://en.wikipedia.org/wiki/BBCode
<code>...</pre>
.
- person Lightness Races in Orbit; 03.04.2011
<code class="php"></code>
? да. Но он должен быть строгим. Могу ли я вставить встроенный CSS или JS в ваш тег code
или pre
? (что в любом случае не имеет смысла, потому что в этом случае вы можете использовать HTML снаружи). Да, это соответствует <code>...</pre>
. Но действительный XML является обязательным условием :)
- person Dejan Marjanović; 03.04.2011
<code class="php"><pre class="php">A</pre>B</code>
является допустимым XML, но ваш код (я полагаю) не сможет экранировать B
в нем.
- person Lightness Races in Orbit; 03.04.2011
Это несколько связано, вам не нужно использовать Geshi, но я написал немного кода здесь Советы по реализации простого регулярного выражения (для разбора bbcode/geshi), которые помогут вам решить проблему.
Его можно настроить, чтобы не использовать GeSHi, просто потребуется немного повозиться. Надеюсь, это поможет тебе.
<a>
,<b>
и т.д.)? - person Alex   schedule 03.04.2011<php></php>
, а затем преобразовать его в тег<code><pre></pre></code>
, он короче. Извинения за него, не мое дело. - person Dejan Marjanović   schedule 03.04.2011