将HTML <link />标记与给定的href属性与regex匹配

时间:2014-03-12 09:27:40

标签: php regex dom

首先,我想说,我不尝试用正则表达式解析HTML,所以不建议我使用PHP DOM,但是我试图使用它,但在我的情况下PHP DOMDocument弄乱了最终的HTML标记,因为其中包含内联JavaScriptjQuery动态代码生成和/或内容替换,例如:

$("#status-message").show(200).html("<div style=''>...</div>")

将输入JavaScript字符串中的内嵌jQuery / HTML代码移至外部.js文件以包含选项(虽然这个可以解决PHP DOMDocument)的问题。

通过使用PHP DOMDocument,最终标记将被saveHTML()方法上的实体替换(当然会生成无效代码),例如:

function zeroPad(num, places) {
  var zero = places - num.toString().length + 1;
  return Array(+(zero &gt; 0 &amp;&amp; zero)).join("0") + num;
}

这是尝试将输入HTML字符串中的给定标记**与** regex 匹配的原因,删除它并返回修改后的HTML字符串(在大多数情况下,输入HTML字符串可能是有效的HTML)。

这是我目前为止使用正则表达式的代码:

<?php
 $html = "<html>
 <head>
 <link rel='stylesheet' type='text/css' href='http://www.example.com/themes/css.min.css'>
 </head>
 <!-- A LOT OF STUF HERE--></html>";
//The URL
 $url = preg_quote("http://www.example.com/themes/css.min.css");
//The pattern
 $pattern = "~<link\s+[href=".$url."][^>]*>~i";
//The output
 $output = preg_replace($pattern, "", $html);
?>
  1. 我尝试匹配<link><head>部分中的给定<body>不区分大小写的)标记(即使它放置在具有给定<body>属性的href)中的无效标记,等于给定的URL。

  2. href属性的展示位置可以是代码中的任何位置,<link>代码也可以是自动关闭的(即所有代码都必须匹配)。

  3. 我不在乎href标签中是否有更多1 <link>个属性(虽然这也是无效标记)(即所有属性必须匹配)...

  4. 我不在乎1 <link>个标签是否具有相同的href属性(即所有标签必须匹配)。

  5. href属性的内容可以使用引号,引号或未引用引用全部,或者,即使它是无效的标记可能会错过引用,或混合使用单/双/无引号(即所有引号都必须匹配)。

  6. 有效匹配的示例:

    <link    rel="stylesheet" type="text/css" href="http://www.example.com/themes/css.min.css">
    <link href='http://www.example.com/themes/css.min.css">
    

    编辑(新的有效示例):

    <LinK    href=http://www.example.com/themes/css.min.css />
    <link  
      href=http://www.example.com/themes/css.min.css />
    

    这让我疯狂了几天,任何帮助都将受到赞赏。

1 个答案:

答案 0 :(得分:2)

试试这个

$url = preg_quote($url, '/');

echo preg_replace('/<link([^>]*?)href[\s]?=[\s]?[\'\"\\\]*'.$url.'([^>]*?)>/is', '', $html);

在行动https://eval.in/118665

中查看