[英]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.