PHP正则表达式将子匹配作为数组返回

时间:2014-04-20 14:36:36

标签: php arrays regex function dom

我对正则表达式有疑问。

我想要做的是只使用一个正则表达式来匹配字符串的一部分,并获得内部划分的内容。不知道如何解释,所以会写一个例子

要解析的示例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',
);

2 个答案:

答案 0 :(得分:3)

使用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查询..(对于相同的)

$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
)

Working Demo - Normal DOM Way

Working Demo - XPath Way

答案 1 :(得分:0)

这就是你想要的:

带有/<span>([^<]*)<\/span>/

preg_match_all

演示:http://regex101.com/r/yD6gM0