PHP Regex 在同一行分别匹配模式

Posted

技术标签:

【中文标题】PHP Regex 在同一行分别匹配模式【英文标题】:PHP Regex matches pattern separately on the same line 【发布时间】:2015-10-22 19:05:03 【问题描述】:

我正在尝试使用 php 正则表达式解析文本。我写了一个与所有内容一致的模式匹配。我不想要这个。它必须与目标分别在同一行匹配。

模式:

/\((?P<type>\w+)((,)*(?P<params>[\d\w\:]+))((,)*(?P<comment>.*))\)/u

目标数据字符串:

lorem ipsum dolor (photo,61) test (photo,62,some text) (video,63) sit amet etc

结果 preg_match_all 带有 PREG_SET_ORDER 标志:

array (size=1)
0 => 
    array (size=11)
      0 => string '(photo,61) test (photo,62,some text) (video,63)' (length=47)
      'type' => string 'photo' (length=5)
      1 => string 'photo' (length=5)
      2 => string ',61' (length=3)
      3 => string ',' (length=1)
      'params' => string '61' (length=2)
      4 => string '61' (length=2)
      5 => string ') test (photo,62,some text) (video,63' (length=37)
      6 => string '' (length=0)
      'comment' => string ') test (photo,62,some text) (video,63' (length=37)
      7 => string ') test (photo,62,some text) (video,63' (length=37)

如果目标数据放在不同的行和相同的正则表达式模式执行结果; (我想要这些结果,但没有换行)

lorem ipsum dolor 
(photo,61) test 
(photo,62,some text) 
(video,63) sit amet etc

array (size=3)
    0 => 
        array (size=11)
          0 => string '(photo,61)' (length=10)
          'type' => string 'photo' (length=5)
          1 => string 'photo' (length=5)
          2 => string ',61' (length=3)
          3 => string ',' (length=1)
          'params' => string '61' (length=2)
          4 => string '61' (length=2)
          5 => string '' (length=0)
          6 => string '' (length=0)
          'comment' => string '' (length=0)
          7 => string '' (length=0)
      1 => 
        array (size=11)
          0 => string '(photo,62,some text)' (length=20)
          'type' => string 'photo' (length=5)
          1 => string 'photo' (length=5)
          2 => string ',62' (length=3)
          3 => string ',' (length=1)
          'params' => string '62' (length=2)
          4 => string '62' (length=2)
          5 => string ',some text' (length=10)
          6 => string ',' (length=1)
          'comment' => string 'some text' (length=9)
          7 => string 'some text' (length=9)
      2 => 
        array (size=11)
          0 => string '(video,63)' (length=10)
          'type' => string 'video' (length=5)
          1 => string 'video' (length=5)
          2 => string ',63' (length=3)
          3 => string ',' (length=1)
          'params' => string '63' (length=2)
          4 => string '63' (length=2)
          5 => string '' (length=0)
          6 => string '' (length=0)
          'comment' => string '' (length=0)
          7 => string '' (length=0)

感谢您的帮助。

【问题讨论】:

我不明白你的意思 没有新行是什么意思,请详细说明 @Uchiha 例如,使用 Enter 键移动到新行。以编程方式:\r\n。这个角色可用,它可以工作,但我想在它不可用的时候工作。 试试这个'~\(.*?\)~' @İsmailCeylan Check This 【参考方案1】:

我找到了一个不影响换行符的解决方案(激进的解决方案是用“~...~”括起来而不是使用“/.../”)

~\((\w+),([\d|:]+),*(.*?)\)~u

命名版本;

~\((?P<type>\w+),(?P<params>[\d|:]+),*(?P<comment>.*?)\)~u

感谢@Uchiha 的预解决方案并感谢您提供的提示。

'~\(.*?\)~'

【讨论】:

【参考方案2】:

直接使用

'~\(.*?\)~'

它会完成的

Regex101 Eval

【讨论】:

以上是关于PHP Regex 在同一行分别匹配模式的主要内容,如果未能解决你的问题,请参考以下文章

lex / flex规则的格式-模式和动作应该在同一行吗?

在 C# 中仅保留 Regex.Split 的匹配模式

正则表达式:匹配除特定模式之外的所有内容

SQL Regex substr模式匹配

js中RegEx中的匹配模式

如何在 C# Regex 中使用lookbehind 来跳过重复前缀模式的匹配?