【问题标题】:Can someone please explain Preg_Match_All [closed]有人可以解释 Preg_Match_All [关闭]
【发布时间】:2012-11-04 03:36:15
【问题描述】:

我试图理解 php 中的 preg_match_all。 我和一个朋友和几个朋友一起开了一个小网站,主要是为了练习编码,不久前我们添加了一个部分,其中包含删除任何图像来源的代码:

$html = file_get_contents('http://www.anyrandomwebsite.com');
preg_match_all('/<img[^>]+>/i',$html, $result);

我们几乎只是在网上找到的,无法理解它,但我知道它会在页面上找到任何图像标签实例并将它们放入数组中。

现在,我正在尝试创建一个代码来搜索页面上任何链接的源代码(因此任何以“http”开头的链接),最好只搜索以特定扩展名结尾的链接(即 .net 或 .zip )

但是,我不知道如何编写模式。我试过学习正则表达式,但根据我朋友的说法,用于查找图像标签的代码不符合正常规则,他们也没有完全理解。

基本上,我在找人写一个 preg_match_all 可以在页面上找到链接,然后请向我解释它为什么起作用,并解释上面的代码是如何工作的(最好是逐个字符地在图案部分)

非常感谢任何对此作出回应的人!

【问题讨论】:

  • 您是否尝试阅读水力压裂法MANUAL,因为它可能比大多数人能够更好地解释它?
  • 我从手册开始,是的。它变得不那么有意义了。 (特别是因为它的定义并不具体,例如,它没有提到 $pattern 是正则表达式,我以前从未使用过,所以需要更多的研究才能弄清楚。然后我花了一段时间学习正则表达式,我发现的大多数指南似乎都跳过了步骤,而且我永远无法理解解释此代码的程度。
  • 例如,在这段代码中:'/]+>/i' 我知道它是从搜索以']',因为我看不到搜索除'>'之外的任何字符会完成什么。我也看不出它是如何找到标签的结尾的。
  • match the character &lt;img literally,然后是 match any character that is not "&gt;",然后是 between one and unlimited times, giving back as possible,然后是 match the "&gt;" character literally。它变得复杂,因为您认为它很复杂。只需通过规则,它是不言自明的。

标签: php html regex preg-match


【解决方案1】:

解释你拥有的正则表达式:

/      # Starting regex delimiter
<img   # Match <img
[^>]+  # Match one or more characters that aren't a >
>      # Match a >
/      # Ending regex delimiter
i      # Case-insensitive option

它是如何工作的?

想象一下img 标签的样子。它以&lt;img 开头,以&gt; 结尾。因此,一旦我们确定了&lt;img 标签,我们需要匹配所有内容,直到最近的&gt;

这意味着我们需要匹配尽可能多的字符,只要它们不是&gt;。这正是[^&gt;]+ 所做的。由于至少需要其中一个字符(&lt;img&gt; 不合法),我们使用+ 而不是“零个或多个”*

您可能会在这里看到一个问题:如果标签 确实 在某处包含&gt; 怎么办,例如。 G。在属性中?这就是为什么使用正则表达式解析 HTML 充满危险的原因之一。

【讨论】:

  • 非常感谢!我终于弄清楚了我的代码,这是一个巨大的帮助!我的代码是preg_match_all('/http(.+)\.zip/i', $html, $result);,由于一个小小的误解,我有一段时间尝试使用[.+] 而不是(.+),但我现在一切都好。再次,非常感谢!
  • 小心,.+ 会在一行中有多个链接时出现问题。
  • 有更好的方法吗?我只是认为(.+_)/zip 意味着它会一直不断地搜索并提取每个字符,直到找到“.zip”为止,据我目前的理解,这几乎是获取整个链接的唯一方法。
  • 很难。不会有完美的解决方案;链接的结构如此多变,以至于您找不到 100% 可靠的正则表达式。朝着正确方向迈出的一步是使用\S(非空白字符)而不是.,因为据我所知,链接永远不会包含实际的空白。所以/http(\S+)\.zip/i应该会好一点。
  • 好的,我会做出改变的。有什么理由为什么使用.+ 特别糟糕? (我知道更具体的\S+ 更好,因为它更具体,但我想知道.+ 可能有什么问题,以便更好地理解并防止将来出现问题)。
猜你喜欢
  • 2014-02-15
  • 2020-08-16
  • 2011-01-08
  • 1970-01-01
  • 2015-10-28
  • 2014-05-18
  • 1970-01-01
  • 2018-05-09
  • 2018-03-19
相关资源
最近更新 更多