如何删除脚本元素中的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éder à la fiche</a>' +
'</div>');
}
}
}
/* ]]> */
充分利用[\s\S]*
非贪婪,即[\s\S]*?
:
\/\*\s*<!\[CDATA\[[\s\S]*?\/\*\s*\]\]>\s*\*\/
梅德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部分,文本节点还是其他任何东西。
Goog解决方案不使用RegExp。但我有一个错误。我用它更新我的文章。 – LeMoussel
似乎不工作。显示'正在处理...'没有结果 – LeMoussel
嗯,我不确定原因。试试这个链接:https://regex101.com/r/ZiH3zj/1 –
同样的错误,但它在PHP中确定。我用PHP发布你的解决方案。 – LeMoussel