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

joh*_*ack 36 php regex string

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

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

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

Lin*_*een 75

您可以使用该标志PREG_OFFSET_CAPTURE:

preg_match('/bar/', 'Foobar', $matches, PREG_OFFSET_CAPTURE);
var_export($matches);
Run Code Online (Sandbox Code Playgroud)

结果是:

array (
  0 => 
  array (
    0 => 'bar',
    1 => 3,     // <-- the string offset of the match
  ),
)
Run Code Online (Sandbox Code Playgroud)

  • @ananda这第一场比赛是正则表达式的*all*.第二个是第一个捕获组.巧合的是,上述代码中的两者都是相同的.例如,如果正则表达式是`/ Foo(bar)/`,则第一个结果将是''Foobar'`,偏移量为零,第二个结果为''bar'`(偏移量为3)为以上. (4认同)

Mar*_*c B 5

preg_match有一个可选的标志,PREG_OFFSET_CAPTURE它记录了原始'haystack'中匹配的出现的字符串位置.请参阅"标志"部分:http://php.net/preg_match