正则表达式 - 最短匹配

时间:2012-06-06 12:30:57

标签: regex

我需要通过正则表达式解析HTML字符串,KEY是否位于我需要提取的VALUE之后。

示例原始字符串:

<TR><TD>VAL1</TD><TD>KEY1</TD></TR><TR><TD>VAL2</TD><TD>KEY2</TD></TR>

当我尝试使用以下内容提取VAL2时

<TD>(.*?)</TD><TD>KEY2</TD>

我实际上得到了

VAL1KEY1VAL2

如果Keys是常量且值正在改变,我该如何解决这个问题呢?

提前致谢, 迈克尔

2 个答案:

答案 0 :(得分:5)

使用

<TD>([^<]*)</TD><TD>KEY2</TD>

代替。您的延迟量词确保最短匹配,但是从第一个匹配位置。在这种情况下,从第一个<TD>开始。上面的解决方案通过限制可能出现在值中的字符来回避问题,因此它不会跨越多个标签。

答案 1 :(得分:1)

我不知道你正在使用什么语言,但如果它是PHP,我认为你最好不要使用DOM而不是使用正则表达式解析它。

这是一种方法:

<?php

$html="<TR><TD>VAL1</TD><TD>KEY1</TD></TR><TR><TD>VAL2</TD><TD>KEY2</TD></TR>";

$doc = new DOMDocument();
$doc->loadHTML($html);

print_r($doc->getElementById(1)->tagName);

$output=array();
$n=0;
while ($val = $doc->getElementsByTagName('td')->item($n++)) {
  $key = $doc->getElementsByTagName('td')->item($n++);
  $output[$key->textContent]=$val->textContent;
}

print_r($output);

这就是我运行它时所显示的内容。

Array
(
    [VAL1] => KEY1
    [VAL2] => KEY2
)