如何使用Regex获取价值?

时间:2013-04-26 07:49:23

标签: php regex

您好我的Regex代码有问题,我用它来使用PHP从HTML标签中获取值。我有以下可能的字符串:

<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>

我有以下preg_match命令:

preg_match('#<span class="last_position.*?">(.+)</span>#', $string, $matches);

这几乎只涵盖案例#3。所以我想知道在last_position前面需要添加什么才能使所有情况都成为可能..?

非常感谢..

编辑:对于想知道要匹配什么值的所有人:“xyz”

5 个答案:

答案 0 :(得分:5)

避免使用正则表达式来解析HTML,因为它可能容易出错。使用DOM解析器可以更好地解决您的特定UseCase:

$html = <<< EOF
<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>
EOF;
$doc = new DOMDocument();
libxml_use_internal_errors(true);
$doc->loadHTML($html); // loads your html
$xpath = new DOMXPath($doc);
$nodeList = $xpath->query("//span[contains(@class, 'last_position')]/text()");
for($i=0; $i < $nodeList->length; $i++) {
    $node = $nodeList->item($i);
    var_dump($node->nodeValue);
}

<强>输出:

string(3) "xyz"
string(3) "xyz"
string(3) "xyz"

答案 1 :(得分:1)

尝试使用此

preg_match('#<span class="?(.*)last_position.*?">(.+)</span>#', $string, $matches);

答案 2 :(得分:1)

你可以试试这个:

preg_match_all('#<span class="[^"]*last_position[^"]*">(.+)</span>#', $string, $matches, PREG_PATTERN_ORDER);

然后,您会在$matches[1][0]$matches[1][1]$matches[1][2]中找到值....

我在类属性值[^"]*中添加的部分匹配任何数量与双引号不匹配的字符。因此它匹配属性值内的任何内容。

答案 3 :(得分:1)

尝试以下操作(是的,您可以使用正则表达式来匹配HTML中的数据):

$string = '<span class="down last_position">xyz</span>
<span class="up last_position">xyz</span>
<span class="last_position new">xyz</span>';

preg_match_all('#<span\s.*?class=".*?last_position.*?".*?>(.+?)</span>#i', $string, $m);
print_r($m);

Online demo

答案 4 :(得分:0)

当然,使用RegEx无法解析 XML ,因为XML不是常规的。但在许多实际情况中,用作输入的XML文档是有限的,可预测的足以简单地将其视为文本。

这样的事情对你有用:

preg_match('#<span class="[^>"]*?last_position[^>"]*">(.+)</span>#', $string, $matches);