如何删除`// <! - [CDATA [`和end` //]] - >`?

时间:2011-11-27 04:09:42

标签: php regex preg-replace cdata

如何删除(//<![CDATA[ , //]]>)块; script元素内的标签。

<script type="text/javascript">
    //<![CDATA[
    var l=new Array();
    ..........................
    ..........................
    //]]>
</script>

看起来可以使用preg_replace()完成,但还没有找到适合我的解决方案。

我会使用什么正则表达式?

8 个答案:

答案 0 :(得分:17)

静态字符串不需要正则表达式。

用任何东西替换文本的那些部分:

$string = str_replace("//<![CDATA[","",$string);
$string = str_replace("//]]>","",$string);

答案 1 :(得分:12)

以下正则表达式会做到这一点......

$removed = preg_replace('/^\s*\/\/<!\[CDATA\[([\s\S]*)\/\/\]\]>\s*\z/', 
                        '$1', 
                        $scriptText);

CodePad

答案 2 :(得分:6)

如果你必须......

$s = preg_replace('~//<!\[CDATA\[\s*|\s*//\]\]>~', '', $s);

这将删除包含每个标记的整行,而不会弄乱所附代码的缩进。

答案 3 :(得分:1)

你也可以尝试,

$s=str_replace(array("//<![CDATA[","//]]>"),"",$s);

答案 4 :(得分:0)

使用str_replace()代替preg_replace()更容易

$var = str_replace('<![CDATA[', '', $var);
$var = str_replace(']]','',$var);
echo $var;

答案 5 :(得分:0)

我使用这样删除<![CDATA[]],但单行现在可以为我工作,不知道是否有多行字符串。

preg_match_all('/CDATA\[(.*?)\]/', $your_string_before_this, $datas); 
$string_result_after_this = $datas[1][0];

答案 6 :(得分:0)

$nodeText = '<![CDATA[some text]]>';
$text = removeCdataFormat($nodeText);    

public function removeCdataFormat($nodeText)
{
    $regex_replace = array('','');
    $regex_patterns = array(
        '/<!\[CDATA\[/',
        '/\]\]>/'
   );
   return trim(preg_replace($regex_patterns, $regex_replace, $nodeText));
}

答案 7 :(得分:0)

如果<![CDATA[包含一些html特殊字符,例如&"'<>,您将使用字符串的其余部分,因为它仍然是XML,您应该转义这些字符。 否则,您将使XML无效。

function removeCDataFromString(string $string)
{
    return preg_replace_callback(
        '~<!\[CDATA\[(.*)\]\]>~',
        function (array $matches) {
            return htmlspecialchars($matches[1], ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8');
        },
        $string
    );
}