PHP - preg_match_all - 有点高兴

bre*_*req 6 php regex preg-match-all preg-match

我需要在字符串中找到文本的特定部分.该文本需要:

  • 12个字符(仅限字母和数字)
  • 整个字符串必须至少包含3位数字
  • 带空格的3*4个字符(例如K9X6 6GM6 LM11)
  • 上面例子中的每个块必须包含至少1个数字
  • 喜欢的话this,line,spod不应该被认可

在此输入图像描述

所以我结束了这段代码:

preg_match_all("/(?<!\S)(?i:[a-z\d]{4}|[a-z\d]{12})(?!\S)/", $input_lines, $output_array); 但它不适用于所有要求.当然我可以使用preg_repacestr_replace删除所有(!,?,#)和循环计数数字,如果有4个或更多,但我想知道是否可以做preg_match_all...

这是一个要搜索的字符串:

?K9X6 6GM6 LM11  // not recognized - but it should be
!K9X6 6GM6 LM11  // not recognized - but it should be
K0X6 0GM7 LM12! // not recognized - but it should be
K1X6 1GM8 LM13@ // not recognized - but it should be
K2X6 2GM9 LM14? // not recognized - but it should be
K3X6 3GM0 LM15# // not recognized - but it should be
K4X6 4GM1 LM16* // not recognized - but it should be
K5X65GM2LM17
bla bla bla
this shouldn't be visible
spod also shouldn't be visible
but line below should be!!
K9X66GM6LM11! (see that "!" at the end? Help me with this)
Run Code Online (Sandbox Code Playgroud)

正确preg_match_all应该返回:

K9X6
6GM6
LM11
K9X6
6GM6
LM11
K0X6
0GM7
LM12
K1X6
1GM8
LM13
K2X6
2GM9
LM14
K3X6
3GM0
LM15
K4X6
4GM1
LM16
K5X65GM2LM17
K9X66GM6LM11
Run Code Online (Sandbox Code Playgroud)

工作实例:http://www.phpliveregex.com/p/bHX

Luc*_*ski 2

以下应该可以解决问题:

\b(?:(?=.{0,3}?\d)[A-Za-z\d]{4}\s??){3}\b
Run Code Online (Sandbox Code Playgroud)

演示

  • [A-Za-z\d]{4}匹配 4 个字母/数字
  • (?=.{0,3}?\d)检查这 4 个字符中是否有数字
  • \s??匹配空白字符,但如果可能的话尝试不匹配它
  • \b确保所有内容都不包含在更大的单词中

请注意,这将允许诸如 之类的字符串K2X6 2GM9LM14,我不确定您是否希望它们匹配。