You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何修改preg_match_all正则表达式,仅提取第二个目标匹配值?

解决方法:调整正则捕获第二个<td>的内容

从你给出的HTML结构来看,每个<tr>里包含两个未闭合的<td>元素,你现在需要提取每个<tr>里第二个<td>对应的内容。

修改正则表达式

你可以调整正则逻辑,先匹配并跳过第一个<td>的内容,然后专门捕获第二个<td>里的目标值。试试这个正则:

$pattern = '~<tr><td>.*?<td>(.*?)(?=<tr>|$)~s';
  • ~ 作为正则分隔符,避免和HTML标签的<>冲突
  • <tr><td>.*?<td>:匹配<tr>开头,以及第一个<td>的全部内容,.*?是非贪婪匹配,确保不会过度匹配到后面的内容
  • (.*?):这是我们要捕获的核心——第二个<td>里的内容
  • (?=<tr>|$):正向预查,让匹配到下一个<tr>或者字符串结尾就停止,避免抓取多余内容
  • s修饰符:让.可以匹配换行符,兼容HTML里可能存在的换行情况

修改后的脚本示例

<?php
$html = '<tr><td>AD - Andorra<td>CA - Canada <tr><td>AE - United Arab Emirates<td>PR - Puerto Rico <tr><td>AF - Afghanistan<td>US - United States of America';

// 调整后的正则
$pattern = '~<tr><td>.*?<td>(.*?)(?=<tr>|$)~s';
preg_match_all($pattern, $html, $matches);

// 输出捕获到的目标内容
print_r($matches[1]);
?>

运行后,$matches[1]里就只会保留你需要的第二个匹配值:CA - Canada、PR - Puerto Rico、US - United States of America。


更可靠的替代方案:用DOM处理HTML

其实非常不推荐用正则处理HTML——HTML结构很容易出现变化(比如新增闭合标签、属性、换行等),正则很容易失效。更稳妥的方式是用PHP内置的DOMDocument和DOMXPath来提取内容:

<?php
$html = '<tr><td>AD - Andorra<td>CA - Canada <tr><td>AE - United Arab Emirates<td>PR - Puerto Rico <tr><td>AF - Afghanistan<td>US - United States of America';

// 初始化DOM对象
$dom = new DOMDocument();
// 忽略不规范HTML的解析错误
libxml_use_internal_errors(true);
$dom->loadHTML("<table>$html</table>"); // 把内容包裹在<table>里,让DOM能正确解析结构
libxml_clear_errors();

// 使用XPath定位第二个<td>
$xpath = new DOMXPath($dom);
$tdNodes = $xpath->query('//tr/td[2]');

// 提取并整理内容
$results = [];
foreach ($tdNodes as $node) {
    $results[] = trim($node->nodeValue);
}

print_r($results);
?>

这种方法不管HTML是否规范,都能准确提取每个<tr>里的第二个<td>内容,维护性和可靠性都比正则高很多。

内容的提问来源于stack exchange,提问作者Wojciech Urbaniak

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 10:34:54