【问题标题】:Perl regex disable parenthesis extractionPerl 正则表达式禁用括号提取
【发布时间】:2012-10-18 08:21:41
【问题描述】:

我正在尝试在 another answer 上找到的东西,但我遇到了一些问题:

我知道 URL 有更好的正则表达式,但请考虑以下示例:

@links=($content =~ m/(https?)?.*[.]com/g);
*$content has text or html

(https?)? 部分用于类似www.google.com 的链接,但有括号将"http" 返回到$1,后者被放入@links!这是个问题,因为我想要整个链接。

什么会从文本中全局提取简单链接(或任何指定的正则表达式)并将它们放入列表中?
简单来说,我的意思是:

  • http://www.google.com
  • www.google.com
  • google.com
  • https://www.google.com

【问题讨论】:

  • 在左括号之后添加?: 将使其不被捕获。这有帮助吗?
  • 也许以下相关主题会有所帮助:How can I extract URL and link text from HTML in Perl?
  • 完美!谢谢! :) 我仍然愿意听到更好的选择@m.buettner
  • @m.buettner 让您的评论成为答案 - 我认为这是正确的

标签: regex perl extract


【解决方案1】:

您的方法太幼稚了,它不会捕获许多其他 URL。 而是使用 Regexp::Common,如下所示:

use Regexp::Common qw/URI/;

my @links = ($content =~ /$RE{URI}/g);

这适用于 HTTP、HTTPS、FTP 等,并正确捕获 URL 参数的更高级组合。

【讨论】:

  • 谢谢!我以前使用过这类模块(当我尝试构建某种爬虫机器人时),但我只是想知道出于任何目的禁用括号!尤其不适用于 URL。不过谢谢
  • @fersarr 如果答案已经解决了您所询问的问题,您应该通过单击向上/向下投票按钮下方的 勾选 图标来接受答案。这会将问题标记为已解决,并向回答问题的人奖励积分,从而激励其他人回答您未来的问题。
【解决方案2】:

非捕获版本如下所示:

m/(?:https?)?.*[.]com/g

为了捕获链接,我使用了这个从 URI::Find: 派生的正则表达式

m<https?://[;/\?:\@&=+\$,\[\]A-Za-z0-9\-_.!~*'()%#]*[/\?:\@&=+\$\[A-Za-z0-9\-_!~*(%#]>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-27
    • 2018-12-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多