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

如何用PHP正则匹配以数字加句点开头的<pre>行?

嘿,我来帮你搞定这个PHP正则的问题~

首先看你遇到的报错:preg_match(): No ending delimiter '^' found,这是因为PHP的正则函数要求表达式必须用分隔符包裹(比如/、#这类符号),你写的正则没有结尾的分隔符,所以直接报错了。这是PHP正则的基础要求,必须给正则加上首尾一致的分隔符才行。

接下来咱们修正正则表达式,你的目标是提取

中以「数字+句点」开头的行,原正则有几个小问题:

  • \d2*是错误写法,你想表达的应该是「一个或多个数字」,正确写法是\d+
  • 没必要直接匹配<pre>标签本身(除非你的$pre数组元素是完整的
    HTML代码),咱们应该针对
    内部的文本行做匹配
  • gm修饰符里,g在preg_match里没用(它只匹配一次,要批量匹配得用preg_match_all),但m是必须的——它是多行模式,能让^匹配每行的开头,而不是整个字符串的开头

给你两种场景的正确实现代码:

场景1:$pre数组元素是
标签的内部文本

比如你已经用simple_html_dom提取了

的innertext,直接处理即可:

// 遍历每个<pre>的内容
foreach ($pre as $preText) {
    // 提取所有以「数字+句点」开头的完整行
    preg_match_all('/^\d+\..*/m', $preText, $matchedLines);
    
    // 输出匹配结果,$matchedLines[0]就是所有符合条件的行
    print_r($matchedLines[0]);
}

场景2:$pre数组元素是包含
标签的完整HTML代码

如果你的$pre里存的是像<pre>1. 第一行\n2. 第二行\n普通行</pre>这样的完整HTML,那先提取

内部的文本再匹配:

foreach ($pre as $preHtml) {
    // 先提取<pre>标签内的文本内容
    preg_match('/<pre>(.*?)<\/pre>/s', $preHtml, $contentMatch);
    if (isset($contentMatch[1])) {
        $preText = $contentMatch[1];
        // 提取符合条件的行
        preg_match_all('/^\d+\..*/m', $preText, $matchedLines);
        print_r($matchedLines[0]);
    }
}

最后解释下关键正则的含义:

/^\d+\..*/m

  • /:正则的首尾分隔符,PHP要求必须有
  • ^:因为加了m修饰符,所以匹配的是每行的开头,不是整个字符串的开头
  • \d+:匹配一个或多个数字(比如1、12、123都能匹配)
  • \.:匹配句点(因为.在正则里是通配符,必须转义才能匹配真实的句点)
  • .*:匹配该行剩下的所有内容(如果只需要匹配开头的数字+句点,去掉这部分就行)
  • m:开启多行模式,让^和$适配每行的首尾

这样就能精准提取你需要的行啦~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 10:00:59