如何删除脚本元素中的CDATA块?

问题描述:

使用PHP,在HTML文件中,我想要删除脚本元素中的CDATA块。如何删除脚本元素中的CDATA块?

<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var A=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var B=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
some text5 ........................ 

我还没有找到如何选择&删除此节点使用XPath & PHP DomDocument

我试着用这个正则表达式 $re = '/\/\*\s*<!\[CDATA\[[\s\S]*\/\*\s*\]\]>\s*\*\//i';

但这消除包括CDATA的2块之间的一个所有文本。

因此,我得到一个空字符串,而不是

some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
some text5 ........................ 

任何想法?

更新与THW的解决方案:

有了这个页面,看来,CDATA段的文本没有得到很好的解析

libxml_use_internal_errors(true); 
$domDoc = new DOMDocument(); 
$domDoc->loadHTMLFile('https://www.maisons-qualite.com/le-reseau-mdq/recherche-constructeurs-agrees/construction-maison-neuve-centre-val-loire'); 
libxml_clear_errors(); 

$xpath = new DOMXpath($domDoc); 
foreach($xpath->evaluate('//text()') as $section) { 
    if ($section instanceof DOMCDATASection) { 
    print_r($section->textContent); 
    $section->parentNode->removeChild($section); 
    } 
} 
$content = $domDoc->saveHTML(); 

我得到这个的textContent

..... 
..... 
function updateConstructeurs(list) { 
    for (var i in list) { 
     if(list[i]['thumbnail']) { 
      jQuery('#reseau-constructeurs').append('<div class="reseau-constructeur">' + 
       '<div class="img" style="background-image:url(' + list[i]['thumbnail'] + ')"> 

function updateConstructeurs(list) { 
    for (var i in list) { 
     if(list[i]['thumbnail']) { 
      jQuery('#reseau-constructeurs').append('<div class="reseau-constructeur">' + 
       '<div class="img" style="background-image:url(' + list[i]['thumbnail'] + ')"></div>' + 
       '<h3>' + list[i]['title'] + '</h3>' + 
       '<a class="btn purple" href="' + list[i]['link'] + '">Accéder à la fiche</a>' + 
      '</div>'); 
     } 
    } 
} 

而作为一个结果,而不是得到一个空字符串,我们有:

     '<h3>' + list[i]['title'] + '</h3>' + 
         '<a class="btn purple" href="'%20+%20list%5Bi%5D%5B'link'%5D%20+%20'">Acc&eacute;der &agrave; la fiche</a>' + 
        '</div>'); 
       } 
      } 
     } 
    /* ]]&gt; */ 

充分利用[\s\S]*非贪婪,即[\s\S]*?

\/\*\s*<!\[CDATA\[[\s\S]*?\/\*\s*\]\]>\s*\*\/ 

演示:https://regex101.com/r/AutLW9/1

+0

似乎不工作。显示'正在处理...'没有结果 – LeMoussel

+0

嗯,我不确定原因。试试这个链接:https://regex101.com/r/ZiH3zj/1 –

+0

同样的错误,但它在PHP中确定。我用PHP发布你的解决方案。 – LeMoussel

梅德Egorov PHP解决方案。

$re = '/\/\*\s*<!\[CDATA\[[\s\S]*?\/\*\s*\]\]>\s*\*\//'; 
$str = '<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var A=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text2 ........................ 
some text3 ........................ 
some text4 ........................ 
<script type="text/javascript"> 
    /* <![CDATA[ */ 
    var B=new Array(); 
    .......................... 
    .......................... 
/* ]]> */ 
</script> 
some text5 ........................'; 
$subst = ''; 

$result = preg_replace($re, $subst, $str); 

echo "The result of the substitution is ".$result; 

CData节是一种字符节点,就像文本节点一样。对于大多数目的,你可以用同样的方式处理它们 - 区别在于序列化。所以使用XPath获取节点,并删除他们,如果他们是CDATA节(而不是文本节点):

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('//text()') as $section) { 
    if ($section instanceof DOMCDATASection) { 
    $section->parentNode->removeChild($section); 
    } 
} 

echo $document->saveHtml(); 

然而,你可能要重新考虑。没有CDATA部分真的很重要吗?您可能需要删除script元素的内容。这是更短:

$document = new DOMDocument(); 
$document->loadHtml($html); 
$xpath = new DOMXpath($document); 

foreach($xpath->evaluate('//script/node()') as $node) { 
    $node->parentNode->removeChild($section); 
} 

echo $document->saveHtml(); 

//script/node()一个script元素内任何子节点相匹配。无论是CDATA部分,文本节点还是其他任何东西。

+0

Goog解决方案不使用RegExp。但我有一个错误。我用它更新我的文章。 – LeMoussel