如何用preg_match_all提取括号外文本并捕获词索引
用preg_match_all获取括号外文本并保留索引
要提取[t- ...]括号外的所有文本片段并获取它们的起始索引,你可以结合环视(lookaround)正则语法,配合preg_match_all的PREG_OFFSET_CAPTURE参数来实现。这里是具体的解决方案:
实现代码
$target = "Hello how [t- are] you [t- today], Sir?"; // 匹配所有不在[t- ...]括号内的文本片段 preg_match_all('/(?:^|(?<=\]))\K.*?(?=\[t-|$)/s', $target, $outerWords, PREG_OFFSET_CAPTURE); // 输出结果 print_r($outerWords[0]);
输出结果
Array ( [0] => Array ( [0] => Hello how [1] => 0 ) [1] => Array ( [0] => you [1] => 18 ) [2] => Array ( [0] => , Sir? [1] => 34 ) )
正则表达式逻辑拆解
(?:^|(?<=\])):非捕获组,指定匹配的起始位置——要么是字符串开头,要么是一个]的后方(确保从括号结束的位置开始匹配)\K:重置匹配起点,让后续内容成为捕获主体(避免把]或字符串起始标记混入结果).*?:非贪婪匹配任意字符,s修饰符让.能匹配换行符(如果你的文本没有换行可以省略)(?=\[t-|$):正向预测终止条件——遇到[t-(括号开头)或字符串结尾就停止,确保不会包含括号内的内容
优化补充:只提取非空片段
如果你的文本可能出现连续括号(比如[t- a][t- b]),上面的正则会匹配括号间的空字符串。若只想保留有实际内容的片段,可把.*?替换为[^[]+,修改后的正则如下:
preg_match_all('/(?:^|(?<=\]))\K[^[]+(?=\[t-|$)/', $target, $outerWords, PREG_OFFSET_CAPTURE);
内容的提问来源于stack exchange,提问作者user3871
相关产品推荐
相关产品推荐

