剥离标签,但不包括<code></code>内的标签

时间:2010-05-18 20:48:37

标签: php javascript syntax-highlighting

我已经看到了一些解决方案,或者至少尝试过,但它们都没有真正起作用。

如何删除除<code>[code]内的所有标记以外的所有标记,并将所有<>替换为&lt;等,以便让JavaScript在输出上做一些语法高亮显示吗?

6 个答案:

答案 0 :(得分:0)

为什么不尝试使用strpos()来获取[code]和[/ code]的位置。

当你有位置时(假设你只有一组代码标签),只需获取之前和之后的所有内容以及该文本上的strip_tags。

希望这有帮助。

答案 1 :(得分:0)

<?php
$str = '<b><code><b><a></a></b></code></b><code>asdsadas</code>';
$str = str_replace('[code]', '<code>', $str);
$str = str_replace('[/code]', '</code>', $str);
preg_match('/<code>(.*?)<\/code>/', $str, $matches);
$str = strip_tags($str, "<code>");

foreach($matches as $match)
{
    $str = preg_replace('/<code><\/code>/', $str, '<code>'.htmlspecialchars($match).'</code>', 1);
}
echo $str;
?>

这将搜索代码标记并捕获标记内的内容。剥去标签。循环匹配将代码标记替换为捕获的文本并替换&lt;和&gt;。

编辑:添加了两个str_replace行以允许[code]。

答案 2 :(得分:0)

使用回调:

$code = 'code: <p>[code]<hi>sss</hi>[/code]</p> more code: <p>[code]<b>sadf</b>[/code]</p>';

function codeFormat($matches)
{
    return htmlspecialchars($matches[0]);
}

echo preg_replace_callback('@\[code\](?:(?!\[/code\]).)*\[/code\]@',  'codeFormat', $code);

答案 3 :(得分:0)

    $str = '[code]
        <script type="text/javascript" charset="utf-8">
            var foo = "bar";
        </script>
        [/code]
        <a href="should get removed">strip me</a>';

echo formatForDisplay( $str );

function formatForDisplay( $output ){
    $output = preg_replace_callback( '#\[code]((?:[^[]|\[(?!/?code])|(?R))+)\[/code]#', 'replaceWithValues', $output );
    return strip_tags($output);
}

function replaceWithValues( $matches ){
    return htmlentities( $matches[ 1 ] );
}

尝试这应该工作,我测试它,它似乎有所期望的效果。

答案 4 :(得分:0)

好吧,我用你所有给定的代码做了很多尝试,现在我正在使用这个代码,但它仍然没有给出预期的结果 - 我想要的是,一个普通的textarea,一个人可以放常规文本,点击输入,有一个新行,不允许在这里标记 - 可能是<strong><b> .... 完美的是识别链接并用<a>标签包围它们

此文字应自动包含<p><br />

要填写各种语言的代码,我们应该输入 [code lang=xxx]代码[/code] - 在最好的情况下[code lang="xxx"]<code lang=xxx>也会有效。 而不是键入代码或复制并粘贴它。

我目前正在使用的代码,至少更改标签并将标签和换行符输​​出除外:

public function formatForDisplay( $output ){
    $output = preg_replace_callback( '#\[code lang=(php|js|css|html)]((?:[^[]|\[(?!/?code])|(?R))+)\[/code]#', array($this,'replaceWithValues'), $output );
    return strip_tags($output,'<code>');
}

public function replaceWithValues( $matches ){
    return '<code class="'.$matches[ 1 ].'">'.htmlentities( $matches[ 2 ] ).'</code>';
}

类似于它在这里工作。

答案 5 :(得分:-2)

strip_tag语法为您提供了确定允许标记的选项: string strip_tags ( string $str [, string $allowable_tags ] ) - &gt;来自PHP手册。

这应该让你在我希望的正确方向上开始。