如何在 PHP 中使用单个正则表达式从字符串中提取所有匹配项?

Hus*_*yin 4 php regex substring

我想使用 PHP 中的正则表达式将所有匹配的模式插入到单个数组中。

例如,我有以下文字:

计算 F 1a5 5W13 153w135 1E55 12_5 1.56 1M55

我的php代码是这样的:

$txt="calculated 1a5 5W13 153w135 1E55 12_5 1.56 1M55";
preg_match_all("/calculated F( ([\d\w_\.]+))+/s",$txt,$matches);
print_r($matches);
Run Code Online (Sandbox Code Playgroud)

我需要像这样的东西:

Array ( [0] =>1a5, [1]=> 5W13, [2]=>  153w135, [3]=>  1E55, [4]=>  12_5, [5]=>  1.56, [6]=> 1M55)
Run Code Online (Sandbox Code Playgroud)

Wik*_*żew 5

您可以使用以下正则表达式解决方案:

$txt="calculated F 15 513 153135 155 125 156 155";
preg_match_all("/(?:\G(?!\A)|calculated(?:\s+F)?)\s*\K[\w.]+/",$txt,$matches);
print_r($matches[0]);
Run Code Online (Sandbox Code Playgroud)

请参阅正则表达式演示。

另请参阅PHP 演示。

请注意,它基本上是您的正则表达式,\G添加了基于自定义的边界以在添加特定模式后匹配连续匹配项。请注意,您[\d\w_\.]是一样[\w.]的\w比赛有什么\d和_比赛。

图案详情:

  • (?:\G(?!\A)|calculated(?:\s+F)?)- 前一个匹配的结尾(\G(?!\A),\G本身匹配字符串的开头或前一个匹配的结尾,因此,(?!\A)减去字符串位置的开头)或calculated+ 1 或 - 可选 - 更多空格 + F(与calculated(?:\s+F)?分支匹配)
  • \s* - 零个或多个空格
  • \K - 匹配重置运算符
  • [\w.]+- 1 个或多个数字、字母_或.字符。

  • @Huseyin:我看到您更新了一个问题,但只更改了示例字符串和示例输出。您没有提供确切的要求。我现在不知道你需要什么。你把你的问题说不清楚了。现在,我只能猜测您要匹配特定字符串后的任何 1+ 非空格序列。尝试[用`\S+`替换最后一个`\d+`并使`\s+F`可选](https://regex101.com/r/Afj68Q/2)。我的解决方案仍然适用于您的新场景。 (2认同)