我使用@Alex's approach here使用内置的DOMDocument从HTML文档中删除脚本标签。问题是,如果我有一个包含Javascript内容的脚本标签,然后又有一个链接到外部Javascript源文件的脚本标签,则不是所有的脚本标签都已从HTML中删除。
$result = '
hey
alert("hello");
';
$dom = new DOMDocument();
if($dom->loadHTML($result))
{
$script_tags = $dom->getElementsByTagName('script');
$length = $script_tags->length;
for ($i = 0; $i < $length; $i++) {
if(is_object($script_tags->item($i)->parentNode)) {
$script_tags->item($i)->parentNode->removeChild($script_tags->item($i));
}
}
echo $dom->saveHTML();
}
上面的代码输出:
heyalert("hello");
hey
从输出中可以看到,仅除去了外部脚本标记。我有什么办法可以确保删除所有脚本标签?
参考方案
您的错误实际上是微不足道的。 DOMNode对象(及其所有后代-DOMElement,DOMNodeList以及其他几个对象!)在其父元素更改时会自动更新,尤其是在其子元素数更改时会自动更新。这是写在PHP文档中的两行代码上,但是大部分都笼罩在地毯下。
如果使用($k instanceof DOMNode)->length循环,然后从节点中删除元素,则会注意到length属性实际上发生了变化!我必须编写自己的库来抵消此问题和其他一些怪癖。
解决方案:
if($dom->loadHTML($result))
{
while (($r = $dom->getElementsByTagName("script")) && $r->length) {
$r->item(0)->parentNode->removeChild($r->item(0));
}
echo $dom->saveHTML();
我实际上并没有在循环-只是一次弹出第一个元素。结果:http://sebrenauld.co.uk/domremovescript.php
php Singleton类实例将在多个会话中保留吗? - php
举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…PHP:检查谁看过发送的电子邮件? - php
我正在向某些用户发送电子邮件,并且想知道是谁阅读的,这意味着如果有人阅读了该电子邮件,则将维护一个日志文件,其中包含该用户的电子邮件地址以及日期/时间/ IP。为此,我发送一个带有电子邮件(html模板)的javascript函数,当用户打开该电子邮件时,它仅会警告用户的电子邮件地址,例如:for($n=0; $n
以下PDO查询返回以下结果:$db = new PDO('....'); $sth = $db->prepare('SELECT ...'); 结果如下: name curso ABC stack CDE stack FGH stack IJK stack LMN overflow OPQ overflow RS…通过>和
在我的所有php代码中,我都在UTC中存储日期和时间,但是我也在使用mysql存储日期时间(也在utc中)。大于和小于运算符会导致日期比较失败吗? $curdate=date('Y-m-d H:i:s'); if($start_datetime>$curdate) 参考方案 不。他们没有办法失败。为此,特意制作了MySQL日期格式。…PHP:填写数组中的“空白” - php
我有一个php数组(通过表单中的复选框值获取-您知道复选框仅在未设置时显示在_POST变量中)。Array ( [2] => 0,2 [3] => 0,3 ) 我需要一种方法来“填补” 0-5之间的差距。所以上面看起来像(用'-1'填充空白。我尝试用填充有'-1'的数组array_merge(),但这没用。Array ( [0] => -1…