正则表达式模式匹配

时间:2012-10-21 00:00:50

标签: php regex preg-match

我想从包含html内容的字符串中提取第一次出现的(<a><span>标记之间的文本)。

我的模式如下:

$pattern='/<a[^(span)][\/\(\)-:@!%*>#=_|?$&";.\w\s]+<\/a> <span/um';

我在<a的第一次出现和<span的最后一次出现之间得到文本输出,而不是第一次出现之间的文本。

例如,html内容:

<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah  </a> <span>blah

想要:

<a href="#">asdasdasd</a> <span

获得:

<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah  </a> <span

2 个答案:

答案 0 :(得分:1)

  1. 使用HTML解析器解析HTML
  2. 使用延迟量词'/<a[^(span)][\/\(\)-:@!%*>#=_|?$&";.\w\s]+?<\/a> <span/um';

答案 1 :(得分:0)

你需要让正则表达式变得懒惰而不是贪婪,告诉它尽可能地将<a<span之间的字符与.+?匹配:

$ptn = '/<a.+?<span/';
$str = '<a href="#">asdasdasd</a> <span blah blah></span> blah blah <a>blah  </a> <span>blah';
preg_match($ptn, $str, $matches);
echo $matches[0];

结果为<a href=\"#\">asdasdasd</a> <span