簡體   English   中英

PHP正則表達式將子匹配作為數組返回

[英]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查詢..(相同)

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

工作演示 - 正常的DOM方式

工作演示 - XPath方式

這是你想要的嗎:

/<span>([^<]*)<\\/span>/preg_match_all

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM