如何在字符串中获取正则表达式匹配的位置?

2022-08-30 11:29:26

我知道如何使用preg_match和preg_match_all来查找给定字符串中正则表达式模式的实际匹配项,但是我正在编写的函数不仅需要匹配项的文本,还需要能够围绕匹配项遍历字符串...

因此,我需要根据正则表达式模式知道匹配项在字符串中的位置。

我似乎找不到一个类似于strpos()的函数,允许正则表达式...任何想法?


答案 1

您可以使用标志PREG_OFFSET_CAPTURE

preg_match('/bar/', 'Foobar', $matches, PREG_OFFSET_CAPTURE);
var_export($matches);

结果是:

array (
  0 => 
  array (
    0 => 'bar',
    1 => 3,     // <-- the string offset of the match
  ),
)

在以前的版本中,此答案在正则表达式 () 中包含捕获组。正如在前几条评论中所证明的那样,这让一些人感到困惑,并且已经被@Mikkel编辑掉了。请忽略这些评论。preg_match('/(bar)/', ...)


答案 2

preg_match有一个可选标志 ,用于记录匹配项在原始“haystack”中出现的字符串位置。请参阅“标志”部分:http://php.net/preg_matchPREG_OFFSET_CAPTURE


推荐