使用PHP,在HTML文件中,我想删除脚本元素中的 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';
但这会删除所有文本,包括2个CDATA块之间的文本 .
结果我得到一个空字符串而不是
some text2 ........................
some text3 ........................
some text4 ........................
some text5 ........................
有任何想法吗?
Update with ThW solution :
有了这个页面,似乎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();
我得到了这个文本内容
.....
.....
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>');
}
}
}
/* ]]> */
3 回答
使
[\s\S]*
非贪婪,即[\s\S]*?
:演示:https://regex101.com/r/AutLW9/1
CData部分是一种字符节点,如文本节点 . 在大多数情况下,您以相同的方式处理它们 - 区别在于序列化 . 因此,使用Xpath获取节点,如果它们是CDATA节(而不是文本节点),则删除它们:
但是你可能想重新考虑一下 . 没有CDATA部分非常重要吗?您可能想要删除
script
元素的内容 . 这甚至更短://script/node()
匹配script
元素内的任何子节点 . 无论是CDATA部分,文本节点还是其他任何东西 .Dmitry Egorov在PHP中的解决方案 .