如何用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
相关产品推荐
相关产品推荐

