You need to enable JavaScript to run this app. PHP正则提取URL中连字符后.html前的7位数字 实现单循环处理
优惠活动
大模型
产品
解决方案
定价
更多

PHP正则提取URL中连字符后.html前的7位数字 实现单循环处理

提取目标7位数字的优化实现

问题根因

你现有代码提取结果混入无关数字的核心逻辑漏洞是:在拿到.html之前的字符串后,直接删除了所有非数字字符,没有锚定目标数字的固定位置。这一操作会把项目标题里的零散数字(比如“300 м2”中的300、其他装饰文案里的数字)和目标ID拼接到一起,最终得到类似30021301919这类不符合预期的结果。

优化方案

完全可以通过锚定位置的正则表达式实现需求,同时把原来的3层foreach循环压缩为1层:

  1. 正则匹配规则:精准定位「连字符后紧跟7位数字、数字后紧跟.html扩展名」的片段,捕获这7位数字作为结果,完全不会混入其他无关数字。
    对应的正则表达式为:/-(\d{7})\.html/
    规则说明:
    • -:锚定目标数字的前置位置,避免匹配到其他零散数字
    • (\d{7}):捕获组,仅提取长度为7的连续数字,不会多抓也不会少抓
    • \.html:锚定目标数字的后置位置,确保提取的是URL中项目ID部分的数字
  2. 精简后的实现代码:
$result = [];
// 仅保留1层foreach,在遍历DOM节点时直接完成提取
foreach ($doc->find('.box-title h2') as $string) {
    $html = pq($string)->html();
    // 匹配到目标结构后直接取捕获的7位数字存入结果
    if (preg_match('/-(\d{7})\.html/', $html, $match)) {
        $result[] = (int)$match[1];
    }
}
return $result;

方案优势

  • 彻底解决无关数字混入的问题:因为正则严格锚定了目标数字的前后位置,哪怕HTML内容里存在其他零散数字(比如项目面积标注、装饰文案里的数字),只要不符合「- + 7位数字 + .html」的结构,就不会被提取。比如第一个元素标题里的“300”、URL路径里其他片段的数字,都会被自动过滤。
  • 循环层级大幅简化:不需要单独做字符串截断、不需要单独做非数字字符替换,只遍历一次DOM节点就完成全部提取逻辑,相比原实现的3层foreach,执行效率更高。
  • 结果格式完全符合预期:提取到的数字会直接转为整数类型,和要求的结果数组结构完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.23 05:45:06