【问题标题】:How to get the position of a Regex match in a string? [duplicate]如何获取正则表达式匹配在字符串中的位置? [复制]
【发布时间】:2012-03-23 04:41:26
【问题描述】:

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

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

我似乎找不到类似于 strpos() 的函数,它允许正则表达式...有什么想法吗?

【问题讨论】:

  • 一旦找到匹配项,就不能直接使用strpos() 找到它的位置吗?
  • 找到匹配项后,您可以使用 strpos() 查找字符串中的位置。
  • @scibuff - 好吧...排序,但是正则表达式可能有很多匹配项,还有很多不同类型的匹配项...这意味着我会添加相当数量的传球如果我不得不使用更多的功能,字符串。
  • @SenorAmor 不,除非您可以假设没有两个匹配项是相同的。

标签: php regex string


【解决方案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
  ),
)

在以前的版本中,此答案在正则表达式 (preg_match('/(bar)/', ...)) 中包含一个捕获组。正如前几个 cmets 所示,这让一些人感到困惑,后来被@Mikkel 编辑掉了。请忽略这些 cmets。

【讨论】:

  • 为什么会返回两次结果?
  • @ananda 第一个匹配是正则表达式的所有。第二个是第一个捕获组。巧合的是,在上面的代码中两者都是一样的。例如,如果正则表达式是/Foo(bar)/,那么第一个结果将是'Foobar',偏移量为零,第二个结果将是'bar'(偏移量为三),如上所述。
  • 手册说:for every occurring match the appendant string offset (in bytes) will also be returned。 UTF-8 或者其他多字节编码呢,它是如何工作的?
  • 回复:Moradnejad 和 Linus Kleen 之间的对话:为了清楚起见,我编辑了答案以删除子模式。
  • 我实际上是通过搜索“php get regex group position”来到这里的,所以您的原始答案对某些人有帮助。也就是说,你最后添加的注释足以让我走上正确的道路。
【解决方案2】:

preg_match 有一个可选标志PREG_OFFSET_CAPTURE,它记录匹配在原始“干草堆”中出现的字符串位置。请参阅“标志”部分:http://php.net/preg_match

【讨论】:

    【解决方案3】:

    通过在 preg_match() 上使用 PREG_OFFSET_CAPTURE,您将获得模式匹配的次数。当有匹配时,它将具有从 0 开始的偏移值。

    使用此值,您可以使用 offset 参数再次调用 preg_match。

    【讨论】:

      猜你喜欢
      • 2013-06-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-02-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-08-03
      相关资源
      最近更新 更多