PHP正则问题:从README提取指定版本的升级通知
正则表达式修正方案:提取指定版本的升级通知
修正后的正则表达式(结合PHP变量)
$pattern = '/== Upgrade Notice ==\s*(?:.*?\n)*?= (' . preg_quote($new_version, '/') . ') =\s*(.*?)(?=\n\s*\n|\Z)/s';
正则规则拆解
- 锁定升级通知区块:
== Upgrade Notice ==\s*(?:.*?\n)*?先匹配升级通知标题,再非贪婪跳过标题后到目标版本前的所有无关内容,确保不会越过目标版本。 - 精准匹配指定版本:
= (' . preg_quote($new_version, '/') . ') =用preg_quote转义版本号中的特殊字符(如.),严格匹配= x.x.x =格式,同时将版本号捕获为组1。 - 提取多行通知内容:
(.*?)(?=\n\s*\n|\Z)非贪婪匹配所有内容,直到遇到空行(\n\s*\n)或文本结尾(\Z),捕获的内容为组2。/s修饰符让.匹配换行符,支持跨多行提取。
PHP函数示例
function extractUpgradeNotice(string $readmeText, string $newVersion): ?array { $pattern = '/== Upgrade Notice ==\s*(?:.*?\n)*?= (' . preg_quote($newVersion, '/') . ') =\s*(.*?)(?=\n\s*\n|\Z)/s'; if (preg_match($pattern, $readmeText, $matches)) { return [ 'version' => $matches[1], 'notice' => trim($matches[2]) ]; } return null; }
需求匹配验证
- 仅在
== Upgrade Notice ==后搜索:正则开头强制匹配该标题,确保范围限定在目标区块内。 - 匹配指定
$new_version:通过preg_quote处理版本号,避免正则特殊字符干扰,精准匹配目标版本。 - 版本号捕获为组1:正则中明确将
= x.x.x =内的版本号放在第一个捕获组。 - 多行内容遇空行停止:利用正向预查终止匹配,
/s修饰符支持跨多行提取,直到空行或文本结束。
内容的提问来源于stack exchange,提问作者Mr. Jo
相关产品推荐
相关产品推荐

