Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/286.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有一个preg可以过滤php中的所有js脚本_Php_Preg Match - Fatal编程技术网

是否有一个preg可以过滤php中的所有js脚本

是否有一个preg可以过滤php中的所有js脚本,php,preg-match,Php,Preg Match,我需要在php中过滤所有Js脚本,我有一个preg/]*?>.*?/si,但它不能很好地工作。是否有一个好的preg可以过滤php中的所有js脚本?此脚本将删除所有脚本元素以及“onload”或“onclick”处理程序中的任何内联脚本: $tags = <<<'EOT' <body onload="alert('onload');"> <div onclick="alert('onclick');"> <script>alert('

我需要在php中过滤所有Js脚本,我有一个preg/]*?>.*?/si,但它不能很好地工作。是否有一个好的preg可以过滤php中的所有js脚本?

此脚本将删除所有脚本元素以及“onload”或“onclick”处理程序中的任何内联脚本:

$tags = <<<'EOT'
<body onload="alert('onload');">
<div onclick="alert('onclick');">
    <script>alert('script');</script>
    <h1 onclick="alert('onclick');">heading</h1>
    content
</div>
<script>var that = this;</script>
<p>paragraph</p>
</body>
EOT;

$doc = new DOMDocument();
$doc->loadHTML($tags);

$scripts = $doc->getElementsByTagName('script');
// Loop through backwards otherwise item($i) will change
for ($i = $scripts->length - 1; $i >= 0; --$i) {
  $script = $scripts->item($i);
  $script->parentNode->removeChild($script);
}

// Not a built-in class
// see comments on http://php.net/manual/en/class.domnodelist.php
$rec = new DOMNodeRecursiveIterator($doc->getElementsByTagName('*'));
foreach ($rec as $node) {
  if ($node->nodeType === 1) {
    $node->removeAttribute('onload');
    $node->removeAttribute('onclick');
  }
}

$body = $doc->getElementsByTagName('body')->item(0);
echo $doc->saveHTML($body);

显然,这不会是防弹的,例如,可能有其他属性,您想删除,但它可能足够好,满足您的需要。DOMDocument能够解析格式不正确的HTML,因此它可能比任何依赖正则表达式的解决方案灵活得多。

这个问题非常模糊,但听起来好像您正试图用RegExps解析HTML,请不要,而是使用DOMDocument类为您解析文档,然后,您可以轻松删除所有脚本标记或具有特定属性的标记,然后再将其导出回字符串。它将更安全、更容易和更易于维护。您是否考虑过JavaScript也可能是内联的?如果您编辑了您的问题并准确地描述了您要做的事情,也许会有所帮助。举个例子会很有用。@Jack,这是一个公平的观点。我进行了编辑,向您展示了如何删除这些类型的属性。我还建议,既然他想删除所有脚本,那么首先运行getElementsByTagName'script'并获取每个结果的父级,然后删除脚本标记$obj->parentNode->removeChild$obj;。避免一些鬼鬼祟祟的人将脚本标签放在div中以隐藏在页面上,提醒“错过了我”@scragar谢谢你的建议。我对代码进行了编辑,使其更加健壮。如有任何进一步意见,将不胜感激。
<body>
<div>
    <h1>heading</h1>
    content
</div>
<p>paragraph</p>