2021-10-20 19:33:18
在 PHP 中,使用正则表达式从 HTML 中提取关键数据(如标题、链接、电子邮件地址和电话号码)是一种常见需求。以下是具体实现方法和注意事项:
1. 提取标题正则表达式:/<title>(.*?)</title>/代码示例:
$html = "<html><head><title>我的标题</title></head><body></body></html>";preg_match_all("/<title>(.*?)</title>/", $html, $matches);echo $matches[1][0]; // 输出:我的标题关键点:
正则表达式:/<as+href="([^"]+)"[^>]*>(.*?)</a>/代码示例:
$html = '<a href="关键点:
正则表达式:/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/代码示例:
$html = "联系我:user@example.com 或 support@domain.org";preg_match_all("/[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+.[a-zA-Z]{2,}/", $html, $matches);print_r($matches[0]); // 输出所有匹配的邮箱关键点:
正则表达式:/(?d{3})?[-s]?d{3}[-s]?d{4}/代码示例:
$html = "电话:(123) 456-7890 或 987-654-3210";preg_match_all("/(?d{3})?[-s]?d{3}[-s]?d{4}/", $html, $matches);print_r($matches[0]); // 输出所有匹配的电话号码关键点:
正则表达式的局限性:
HTML 结构复杂时(如嵌套标签、属性含特殊字符),正则表达式可能失效。建议使用 DOM 解析器(如 DOMDocument)处理复杂 HTML。
性能优化:
对大文本多次使用 preg_match_all 可能影响性能,可考虑预编译正则(preg_quote)或限制匹配范围。
转义特殊字符:
在动态生成正则时,用 preg_quote 转义用户输入,避免正则注入。
若 HTML 结构复杂,推荐以下方法:
$dom = new DOMDocument();@$dom->loadHTML($html); // 抑制加载错误// 提取标题$title = $dom->getElementsByTagName('title')->item(0)->nodeValue;// 提取链接$links = [];foreach ($dom->getElementsByTagName('a') as $link) { $links[] = $link->getAttribute('href');}通过正则表达式或 DOM 解析器,可以灵活应对不同场景的数据提取需求。正则适合简单模式,而 DOM 解析器更适合复杂 HTML 结构。