PHP 使用正则表达式匹配第 N 个闭 HTML 标签的内容
在 PHP 中,使用 curl
库爬某些网页,经常需要对 HTML 标签进行提取,我们可以使用一些第三方库,如比较出色的 PHP Simple HTML DOM Parser。也可以使用 PHP 自带的解析 XML 操作。这里介绍使用正则表达式来匹配。
单行的匹配
我们先来看一下单行的情况,如:
<div>
<span id="name1" data="data1">value1</span>
<span id="name2" data="data2">value2</span>
<span id="name3" data="data3">value3</span>
</div>
使用 PHP 的句点,就能匹配到第一个 span 标签的值 value1 ,比较简单。
$str = <<<EOF
<div>
<span id="name1" data="data1">value1</span>
<span id="name2" data="data2">value2</span>
<span id="name3" data="data3">value3</span>
</div>
EOF;
preg_match('/<span id="name1"[^>]*>(.*)<\/span>/', $str, $matches);
print_r($matches);
输出:
Array
(
[0] => <span id="name1" data="data1">value1</span>
[1] => value1
)
多行的匹配
假设有一个 html 标签如下。
<div>
<span id="name1" data="data1">
value1
</span>
<span id="name2" data="data2">
value2
</span>
<span id="name3" data="data3">
value3
</span>
</div>
需要提取第一个 span 标签的内容 value1。需要结合 s
修饰符和 ?
元字符。
s
修饰符:模式中的点号元字符匹配所有字符,包含换行符。
?
元字符:作为量词,表示 0 次或 1 次匹配。
$str = <<<EOF
<div>
<span id="name1" data="data1">
value1
</span>
<span id="name2" data="data2">
value2
</span>
<span id="name3" data="data3">
value3
</span>
</div>
EOF;
preg_match('/<span id="name1"[^>]*>(.*?)<\/span>/s', $str, $matches);
print_r($matches);
输出:
Array
(
[0] => <span id="name1" data="data1">
value1
</span>
[1] =>
value1
)