【问题标题】:Match the HTML <link> tag with given href attribute with regex将 HTML <link> 标签与给定的 href 属性与正则表达式匹配
【发布时间】:2014-03-12 09:27:40
【问题描述】:

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

$("#status-message").show(200).html("&lt;div style=''&gt;...&lt;/div&gt;")

将内联 JavaScript/jQuery 代码从输入 HTML 字符串移动到外部 .js 文件以供包含是不是一个选项(尽管这可能 用 PHP DOMDocument 解决问题。

通过使用 PHP DOMDocument,最终标记在 saveHTML() 方法(当然会产生无效代码)上被 entities 替换,例如:

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 字符串(输入 @ 987654337@ 字符串在大多数情况下可能是有效的HTML)。

到目前为止,这是我使用 regex 的代码:

<?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. 我正在尝试匹配&lt;head&gt;&lt;body&gt; 部分中的给定&lt;link&gt;不区分大小写)标记(即使它在放置在@987654343 中时标记无效@) 具有给定的href 属性,等于给定的 URL。

  2. href 属性的位置可以在标签中的任何位置,&lt;link&gt; 标签也可以是自闭合的,也可以不是(即必须全部匹配)。

    李>
  3. 我不在乎&lt;link&gt; 标记中是否有超过 1 个href 属性(尽管这也是无效标记)(即它们都必须匹配)..

  4. 我不在乎是否有超过 1 个具有相同 href 属性的 &lt;link&gt; 标记(即它们都必须匹配)。

  5. href 属性的内容可以用引号、引号或不加引号来引用,或者,即使是无效的标记也可能会遗漏一个引号,或者混合使用单引号/双引号/无引号(即所有引号都必须匹配)。

有效匹配示例:

<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 />

这几天让我发疯,我们将不胜感激。

【问题讨论】:

    标签: php regex dom


    【解决方案1】:

    试试这个

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

    在行动中看到它https://eval.in/118665

    【讨论】:

    • 不,看这里:eval.in/118670,它将匹配不需要的东西(ss 来自n.css)。
    • 它不匹配,它的替换,仅此而已.. 它替换了所有匹配的内容
    • OP 想要替换所有匹配并显示不匹配的内容。这就是它的作用
    • Im the OP actually :) Maybe I was not clear in my question: I need to match the whole given URL, not a part from it (i.e. n.css, but not only the ss` 来自上面评论中的示例)并替换整个&lt;link&gt;标签。
    • 试试这个eval.in/119229 我添加了s 修饰符以匹配换行符并将.*? 更改为[^&gt;]*?。但是现在如果你有一个没有结束 &gt; 的链接标签,那么这将不匹配它。
    猜你喜欢
    • 2011-04-12
    • 1970-01-01
    • 2011-09-03
    • 1970-01-01
    • 2012-02-18
    • 1970-01-01
    • 2022-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多