【问题标题】:Why does my RegEx only end if I include some additional characters?为什么我的 RegEx 仅在我包含一些额外字符时才结束?
【发布时间】:2013-02-08 09:32:57
【问题描述】:

好的,假设我正在尝试解析:

href="http://google.com">Website</a>

这不起作用:

preg_match('/href="http:\/\/(.+)">/', $a, $b);

但这确实:

preg_match('/href="http:\/\/(.+)">Website/', $a, $b);

这是为什么?第一个只是一直到字符串的末尾。

【问题讨论】:

  • 它对我来说似乎工作正常
  • @Dale:可能是因为我们使用了不同版本的 RegEx 或 PHP 之类的。我正在开发一个几年前的系统。
  • 在你的 preg_match 之后做一个print_r($b);,你有没有捕捉到你想要的东西?
  • RegExp 库没有太大变化。最有可能的是,您实际上并没有将href="http://google.com"&gt;Website&lt;/a&gt; 用作干草堆,而是使用包含另一组双引号的更长字符串。

标签: php regex parsing preg-match


【解决方案1】:

贪心选择器

这里的问题是你的选择器是贪婪的——它会匹配尽可能长的字符串:

preg_match('/href="http:\/\/(.+)">/', $a, $b);

由于您使用“任何字符”(.),它一直匹配到输入字符串中存在的最后一个 "&gt;

非贪心选择器

如果你让选择器不贪婪,那么它将在最短的匹配中停止:

preg_match('/href="http:\/\/(.+?)">/', $a, $b);

注意正则表达式模式中额外的?,它将“一个或多个”(+) 运算符修改为不贪婪。

您还可以使用u modifier 使所有选择器默认为非贪婪:

preg_match('/href="http:\/\/(.+)">/u', $a, $b);

【讨论】:

  • 或者您可以将其更改为整个表达式:/.../u
【解决方案2】:

这是我用来测试的最好的 href 解析器

 preg_match("#href=[\"|']([^\"]*)[\"|']#",' '.$a.' ',$b);

【讨论】:

  • 英镑符号而不是 preg_match 中的正斜杠是什么意思?
  • 不回答/解释问题。 @JohnSmith - 正则表达式的第一个和最后一个字符可以是任何字符,# 通常用于正斜杠(这是要使用的常规字符)构成模式的一部分 - 这样你就不需要模式中转义它们。
  • @JohnSmith 它们只是类似于您在问题中使用的 / 的分隔符,只是另一种变体
猜你喜欢
  • 1970-01-01
  • 2020-06-02
  • 2019-09-18
  • 2020-05-18
  • 1970-01-01
  • 2015-06-20
  • 2019-01-18
  • 1970-01-01
  • 2022-10-26
相关资源
最近更新 更多