PHP - preg_match_all - 稍微高级一点

6

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

  • 该文本需要具有:
  • 12个字符(仅限字母和数字)
  • 整个字符串必须至少包含3个数字
  • 3 * 4个带空格的字符(例如 K9X6 6GM6 LM11
  • 上述示例中的每个块都必须至少包含1个数字
  • 不应识别像thislinespod这样的单词

enter image description here

所以我最终得到了这段代码:

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)

正确的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

示例: http://www.phpliveregex.com/p/bHX

这是一个工作示例,可以通过上面的链接进行访问。

1
上面的每个块都必须包含至少1个数字,"3*4个字符"意味着整个字符串必须包含至少3个数字。 :) - Ja͢ck
好的,也许我无法用言语解释清楚,所以我刚刚更新了我的问题,并添加了图片以更好地解释我所需要的内容。 - breq
当没有空格时,块逻辑是否仍然适用?换句话说,ABCDE123FGHI 是否是有效的输入? - Lucas Trzesniewski
1个回答

2
以下内容应该能解决问题:
\b(?:(?=.{0,3}?\d)[A-Za-z\d]{4}\s??){3}\b

演示

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

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


没错,就是这样。像 K2X6 2GM9LM14 这样的字符串也是有效的,非常感谢! - breq
还有一个问题。现在它只接受空格,如果我想将\s??更改为允许空格以及其他分隔符,如“_”、“-”(破折号和减号) - 如何修改该正则表达式? - breq
@breq 将 \s?? 改为 [\s_-]??。你必须将 - 短线放在 [...] 字符集的开头或结尾。 - Lucas Trzesniewski
谢谢。//一些不重要的文本以达到字数限制 - breq

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接