替换<pre> tags with <code></code></pre>

时间:2012-05-04 12:12:34

标签: php html parsing simple-html-dom

我需要做的是用代码标签替换所有预标签。

实施例

<pre lang="php">
    echo "test";
</pre>
Becomes
<code>
    echo "test";
</code>
<pre lang="html4strict">
    <div id="test">Hello</div>
</pre>
Becomes
<code>
    <div id="test">Hello</div>
</code>

等等..

由于里面有希腊文字,php的默认DOM函数存在很多问题 我认为Simple HTML DOM Parser是我需要的,但我无法弄清楚如何做我想要的。
有什么想法吗?

更新
我移动到一个新的CMS,这就是为什么我写入一个脚本,以便在插入数据库之前将所有帖子格式化为正确的格式。我不能在新的CMS中使用pre标签。

3 个答案:

答案 0 :(得分:2)

为什么不KISS(保持简单,愚蠢):

echo str_replace(
    array('<pre>', '</pre>'),
    array('<code>', '</code>'),
    $your_html_with_pre_tags
);

答案 1 :(得分:2)

查看manual。将<pre>代码更改为<code>应该非常简单:

$str = '<pre lang="php">
    echo "test";
</pre>
<pre lang="html4strict">
    <div id="test">Hello</div>
</pre>';
require_once("simplehtmldom/simple_html_dom.php");
$html = str_get_html($str);
foreach($html->find("pre") as $pre) {
    $pre->tag = "code";
    $pre->lang = null; // remove lang attribute?
}
echo $html->outertext;

// <code>
//     echo "test";
// </code>
// <code>
//     <div id="test">Hello</div>
// </code>

PS:您应该对输入中的"<>字符进行编码。

答案 2 :(得分:0)

如果元素中有pre之类的任何块级元素,只需用code标记替换div标记就会更改含义和渲染,并使标记无效。所以你需要修改你的目标。看看你是否可以继续使用pre。如果没有,请改为使用<div class=pre>以及在渲染时使其行为类似pre的样式表。当您使用pre标记替换div代码时,您将不会创建语法错误(div的内容模型允许pre允许的任何内容,以及更多内容。< / p>

关于lang属性,lang="php"不正确(根据HTML规范,lang属性使用标准语言代码指定内容的人类语言)但是编码计算机语言信息的想法很好。它可能有助于以后的样式和脚本。 HTML5草案提到可以使用以language-开头的类名来编码此类信息,例如class="language-php"' (or, when combined with another class name, class =“language-php pre”'。