PHP 5.6提取所有Markerword开头至首个句号序列的问题
解决PHP提取所有目标序列的问题
搞定这个问题很简单!你的原代码有两个关键问题,导致只能拿到残缺的最后一个匹配结果:
- 用了
preg_match:这个函数只会返回第一个匹配项,没法捕获所有符合规则的序列; - 多余的
substr操作:错误地把Markerword:后面的有效内容截断了,完全不符合你的需求。
修正后的代码(兼容PHP 5.6)
我们改用preg_match_all来捕获所有匹配项,配合精准的正则表达式就能实现需求:
$resultstring = ''; // 先检查目标标识是否存在,避免无意义的正则匹配 if (strpos($searchstring, "Markerword:") !== false) { // 正则表达式:精准匹配从"Markerword: "到首个"."的完整序列 // 解析: // - Markerword: 精确匹配起始标识(注意后面的空格) // - [^.]+\. 匹配任意非句号的字符,直到遇到第一个句号(包含句号) preg_match_all('/(Markerword: [^.]+\.)/', $searchstring, $matches); // 如果捕获到结果,将所有序列用空格拼接成目标字符串 if (!empty($matches[1])) { $resultstring = implode(' ', $matches[1]); } } // 输出最终结果 echo $resultstring;
效果验证
用你提供的示例字符串测试,这段代码会输出你期望的内容:
Markerword: with a lot of other things like commata, special characters ä, ü, ß or % and more in it. Markerword: contains more of it multiple times and in caotic characters. Markerword: contains this, then cut the whole sequence out - until the first dot after that markerword.
关键细节说明
preg_match_all:和preg_match不同,它会遍历整个字符串,把所有符合规则的内容都捕获到$matches数组中;- 正则表达式:
/(Markerword: [^.]+\.)/确保只匹配从Markerword:开始,到后面第一个句号结束的完整片段,不会误匹配其他内容; - PHP 5.6兼容性:
preg_match_all和所用的正则语法在PHP 5.6中完全支持,无需担心版本问题。
内容的提问来源于stack exchange,提问作者matt




