簡體   English   中英

在preg_match請求中獲取所有匹配項

[英]Get all matches in a preg_match request

我遇到以下問題,我有那個結構:

$table = '
<table>
    <tbody>
        <tr valign="top">
            <td>foo</td>
            <td>bar</td>
        </tr>
    </tbody>
</table>
<table>
    <tbody>
        <tr valign="top">
            <td>bee</td>
            <td>dog</td>
        </tr>
    </tbody>
</table>';

我正在嘗試使用所有<tr>檢索數組,但沒有成功。 我能做到的最接近的模式,將所有混亂都歸還了。

$pattern = "/<tr valign[^>]*>(.*)<\/tr>/s";
preg_match_all($pattern, $table, $matches, PREG_PATTERN_ORDER);

如果我放var_dump($matches) ,我想要一個返回的數組:

array(
    [0] => "<td>foo</td><td>bar</td>",
    [1] => "<td>bee</td><td>dog</td>"
);

...或類似的東西。

但我收到:

string(301) "
    foo
    bar
    "
<table>
        <tbody>
            <tr valign="top">
                <td>bee</td>
                <td>dog</td>
            </tr>
    </tbody></table>

有人知道我在做什么錯嗎?

提前致謝。

您必須使量詞變得懶惰: .* => .*?

當您使用貪婪的量詞時, .*將使用所有可能的字符;當您使用惰性量詞時, .*? 將使用最少的字符數。

當您使用惰性量詞時,正則表達式引擎將一個接一個地處理字符,並測試每個字符的模式完成情況。

當您使用貪婪的量詞(默認行為)時,正則表達式引擎將獲取所有可能的字符(直到您的情況結束),並將逐字符回退,直到模式完成成功為止。

筆記:

添加PREG_PATTERN_ORDER是沒有用的,因為它是preg_match_all的默認集合。

DOMDocument可能是處理html的更適合的工具。 例:

$dom = new DOMDocument();
@$dom->loadHTML($table);

$trs = $dom->getElementsByTagName('tr');

$results = array();

foreach ($trs as $tr) {
    if ($tr->hasAttribute('valign')) {
        $children = $tr->childNodes;

        $tmp = '';
        foreach ($children as $child) {
            $tmp .= trim($dom->saveHTML($child));
        }
        if (!empty($tmp)) $results[] = $tmp;
    }
}

echo htmlspecialchars(print_r($results, true));

暫無
暫無

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

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