【问题标题】:Perl Regex to parse first anchor <a> tagPerl Regex 解析第一个锚 <a> 标记
【发布时间】:2019-06-03 03:23:51
【问题描述】:

下面的 HTML 页面有两个 anchor 标记作为我的 perl 脚本的输入:

<a href="link.html"> TITLE </a> <a href="link.html"> SUB TITLE </a>

我只想提取标题,即我只需要来自第一个锚标记 &lt;a&gt; 的文本,第二个锚标记 &lt;a&gt; 文本应该被忽略。我只需要使用 Perl 正则表达式来做到这一点。

我在正则表达式下尝试过,但它没有按预期工作:

<a[^>]*[^>]*>(?!.*a>.*)a>


整个脚本是这样的:

#!/usr/bin/perl

use strict;
use warnings;

my $str = '<a href="link.html"> TITLE </a> <a href="link.html"> SUB TITLE </a>';

my $res = $str =~ m/<a[^>]*[^>]*>(?!.*a>.*)a>/;

print $res;

执行:

 prakash@prak-pc:~$ perl regtest.pl 
 prakash@prak-pc:~$

【问题讨论】:

  • 为什么不使用适当的 HTML 解析器,例如 Mojo::DOMHTML::TreeBuilderHTML::LinkExtor?还请edit您的帖子并向我们展示一些有代表性的输入数据,这些数据显示您的代码如何失败。还请告诉我们您现有的正则表达式如何无法按预期工作。
  • 如果不全局执行匹配,&lt;a[^&gt;]*&gt;(.*?)&lt;\/a&gt; 就够了。在这里查看regex101.com/r/SvqGvi/1
  • 如果这是家庭作业,请提前告诉我们。否则,让您的系统管理员安装现成的模块。
  • 然后edit 您的帖子并告诉我们您现有的正则表达式如何失败。我们需要minimal reproducible example,然后才能继续进行。另一方面,安装其中一个模块或将其中一个模块复制到源代码中并不难。
  • @Corion,已编辑。请立即检查并帮助我。

标签: regex perl parsing


【解决方案1】:
my $str = '<a href="link.html"> TITLE </a> <a href="link.html"> SUB TITLE </a>';
my ($res) = $str =~ m~<a[^>]*>(.*?)</a>~;
print $res,"\n";

说明:

m~          # match operator, delimiter
    <a      # literally <a
    [^>]*   # 0 or more any character tat is not >
    >       # >
    (.*?)   # group 1, 1 or more any character, not greedy
    </a>    # literally
~           # regex delimiter

如果您不想匹配前导空格和尾随空格,可以使用m~&lt;a[^&gt;]*&gt;\h*(.*?)\h*&lt;/a&gt;~

【讨论】:

    【解决方案2】:
    /^(?:<a[^>]*>)([^<]*)/
    

    查看 regex101 上的演示 https://regex101.com/r/Po3goc/1

    • ^ 在行首断言位置 非捕获组 (?:]>) ]
      • 量词 - 在零次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

        匹配字符 > 字面意思(区分大小写) 匹配字符 > 字面意思(区分大小写) 1st Capturing Group ([^) 匹配下面列表中不存在的单个字符 [^

      • 量词 - 在零次和无限次之间匹配,尽可能多次,根据需要回馈(贪婪)

    【讨论】:

      猜你喜欢
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 2020-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多