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

如何用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 03:29:58