【问题标题】:php preg_match multiple patternsphp preg_match 多个模式
【发布时间】:2013-12-31 11:53:32
【问题描述】:

我需要在文本中找到像 @[0000:0000:Username] 这样的字符串。

然后我需要提取第一个数字序列(用户 ID)和用户名。 然后我需要用链接替换它们。

我能够提取第一个数字序列,但用户名是可变的。它可以有多个单词(和空格),但也可以是一个单词,例如“John”、“John Doe”、“John Doe Junior”。

用户名可以包含字母数字字符、句点、下划线和破折号。

这是我现在拥有的用户名,最多 4 个单词:

/@\[(\d*):\d*:(\S*|\S*\s*\S*\s*\S*\s*\S*)\]/

这是我要创建的链接:

<a href="http://www.facebook.com/user-id/" target="_blank">Username</a>

我正在尝试这样:

<a href="http://www.facebook.com/$1/" target="_blank">$2</a>

如果只找到一个匹配项,这将正常工作。一旦有更多的匹配,它就会搞砸。

任何帮助将不胜感激。

【问题讨论】:

  • @AmalMurali 用户名不能超过 4 个字。
  • @Barmar:好吧,OP 说Obviously this doesn't work.。它确实(对于问题中显示的示例)。我认为可以通过解释您的所有要求来改进这个问题,@Ziggy。
  • 他说“用户名最多 4 个字”。这是他描述不必要的限制的方式。

标签: php regex


【解决方案1】:

这应该可以解决问题:

/@\[(\d+):\d+:([^\]]+)\]/

[^]] 搜索所有不是 ] 的字符,所以基本上所有字符都直到最后的 ]

【讨论】:

  • 第二个捕获应该是用户名,而不是第二个数字。
  • 谢谢。现在已经修好了。
【解决方案2】:

试试:

/@\[(\d*):\d*:([\w. \-]*)\]/m

[\w. \-] 匹配字母、数字、下划线、句点、空格和破折号。 * 允许任意数量的这些。

【讨论】:

  • 是的,您确实需要转义 -。它是范围运算符,如A-Z
  • 他原来的正则表达式是\d*。由于那不是他有问题的部分,我认为这就是他想要的。
  • 如果您忘记转义 -,请参阅 stackoverflow.com/questions/20758841/…
  • 确实如此。但既然我没有把它放在那里,我需要逃避它。这是一种更简单、更安全、更通用的方法。
  • 无需在字符类的开头或结尾处转义-
【解决方案3】:
@\[(\d+):\d+:([-\w. ]+)\]

Live demo

【讨论】:

  • 还有这个。谢谢各位!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-16
  • 1970-01-01
  • 2020-10-16
相关资源
最近更新 更多