[英]PHP Regular expression return submatches as array
我有关于正则表达式的问题。
我想要做的是只使用一个正则表达式来匹配字符串的一部分,并获得内部划分的内容。 不知道如何解释,所以会写一个例子
要解析的示例html
<div class="test">
<span>a</span>
<span>b</span>
<span>c</span>
<span>d</span>
</div>
<div class="test2">
<span>aa</span>
<span>bb</span>
<span>cc</span>
<span>dd</span>
</div>
我想preg_match(_all)只跨越.test的值
通常,我会用
preg_match('/<div class="test">(.*?)<\/div>/', $html, $matches)
preg_match_all('/<span>(.*?)<\/span>/', $matches[1], $matches2)
然后使用另一个preg_match_all来获取值。
但是,我想知道是否有一种方法可以在一个模式中创建一个子模式,该模式会自动首先匹配div,然后是所有跨度,并将resulat作为数组返回。
这样的事情可能吗? 我无处可寻。 也许我不知道它在技术上是怎么称呼的。
编辑:输出我想得到(更改数据样本),但只有一个preg_match或preg_match_all调用 :
array(
'a',
'b',
'c',
'd',
);
使用DOMParser
而不是正则表达式..
$dom = new DOMDocument;
$dom->loadHTML($html);
foreach ($dom->getElementsByTagName('div') as $tag) {
if ($tag->getAttribute('class') === 'test')
{
foreach($tag->getElementsByTagName('span') as $stag)
{
$val[]=$stag->nodeValue;
}
}
}
print_r($val);
$xpath = new DOMXpath($dom);
$elements = $xpath->query("*/div[@class='test']/span");
foreach($elements as $v)
{
$arr[]=$v->nodeValue;
}
print_r($arr);
OUTPUT :
Array
(
[0] => a
[1] => b
[2] => c
[3] => d
)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.