您好我的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”
答案 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);
答案 4 :(得分:0)
当然,使用RegEx无法解析 XML ,因为XML不是常规的。但在许多实际情况中,用作输入的XML文档是有限的,可预测的足以简单地将其视为文本。
这样的事情对你有用:
preg_match('#<span class="[^>"]*?last_position[^>"]*">(.+)</span>#', $string, $matches);