PHP 使用正则表达式匹配第 N 个闭 HTML 标签的内容

Php 2020-08-29 阅读 28 评论 0

在 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
    
)
最后更新 2020-08-30