Perl正则表达式:在字符串中搜索所有class =“”并在数组中保存值

时间:2013-01-05 17:12:18

标签: regex perl

我正在尝试从HTML文档中的字符串中获取类。 字符串例如:

<span class="bullet first">Some</span>Published <abbr class="published">Sometexthere</abbr></p>

所以,我想要实现的是获取字符串中的所有“类”(bullet,first,published)。 但问题是它可以是字符串中的任何数量的class =“”。 所以,我想有一个正则表达式无法做到这一点,我需要在这里循环吗?

3 个答案:

答案 0 :(得分:2)

无论你怎么做,这都是一个两步的过程:

  1. 提取类属性的值(“bullet first”,“published”)。
  2. 从这些值中提取类(“bullet”,“first”,“published”)。
  3. XML :: LibXML(也是一个HTML解析器):

    my @classes =
       map split(' ', $_->getValue()),          # Step 2
          $xpc->findnodes('*/@class', $node);   # Step 1
    

    (或者.//*/@class,取决于你想要的东西。)

答案 1 :(得分:0)

如果您确定html不包含<p> class="abc" <\p>等复杂数据,那么使用全局修饰符循环使用正则表达式将使其启动它与上次匹配的位置。 实施例

While ($_=~ /class="(.*?)"/g) {
    #process class names here
    #class is in $1
}

但是对于一般用途,建议使用html解析器,因为这会将字符串<p> class="abc" <\p>处理为包含类abc

答案 2 :(得分:0)

我正在添加这个以回答 '部分所以,我想有一个正则表达式无法做到这一点,我需要在这里循环吗?'

你必须在regexp中使用修饰符g

my $text = '<span class="bullet first">Some</span>Published <abbr class="published">Sometexthere</abbr></p>';
while($text =~ /class\s*=\s*"([^"]+)"/g) {
  print "class --> $1\n";
}

这是结果

class --> bullet first
class --> published