我应该删除从通用网站网址的file_get_contents中获取的PHP中标签之间的所有内容(和标记)。我使用的是RegEx表达式:
preg_replace('/<script\b[^>]*>(.*?)<\/script>/is', "", $string);
它工作得很好,但是我的问题是,如果一个脚本包含CDATA标签,它就不能工作。字符串的一个例子是:
<script type='text/javascript'>
/* <![CDATA[ */
var variable = {"ajax":"....."}
/* ]]> */
</script>
我想问题在于那些"/“和"/”标签。
我已经在google和Stack溢出上搜索过了,但是毫无疑问,使用特定类型的cdata标记(使用/*和*/),所以什么都不起作用。
有什么建议吗?
编辑:回答说,我现在使用的代码如下:
foreach($dom->getElementsByTagName('script') as $scripttag){
$scripttag->parentNode->removeChild($scripttag);
}
然后我有:
foreach($dom->getElementsByTagName('ins') as $string) {
$string2 .= $string->nodeValue;
$string2 .= ' ';
}
但这将返回一个带有脚本标记的$string2。
编辑2(解决了):在的帮助下,我发现使用解决了问题:
$xpath = new DOMXpath($dom);
foreach ($xpath->query('//script') as $node) {
$node->parentNode->removeChild($node);
}
这也会移除另一个标记中的脚本标记,例如:
<ins><script>First JS</script></ins>
<ins>Hello</ins>
<script>Second JS</script>
威尔输出
Hello
谢谢大家的帮助!
发布于 2015-11-18 06:16:40
不要为此使用regex,请使用适当的html解析器,如domdocument:
$dom = new DOMDocument('1.0', 'utf-8');
$dom->loadHTML($html);
//removing elements from a nodelist resets the internal pointer, so traverse backwards:
$elements = $dom->getElementsByTagName('script');
$count = $elements->length;
while(--$count){
$elements->item($count)->parentNode->removeChild($elements->item($count));
}
//you can do further dom manipulation here if needed
$insertContents='';
foreach($dom->getElementsByTagName('ins') as $insert){
$insertContents .= $insert->nodeValue . ' ';
}
//if you need the complete html at all:
$html = $dom->saveHTML();
//your desired string:
echo $insertContents;
https://stackoverflow.com/questions/33782262
复制相似问题