在括号内提取数字的PHP正则表达式

3
我正在构建一个具有回复功能的聊天系统。 如何匹配“@”符号和括号内的数字,例如:@[123456789]? 这个在JavaScript中可以实现。
/@\[(0-9_)+\]/g

但是在PHP中,它无法识别/g修饰符,因此它无法正常工作。所以我尝试了这个:
/\@\[[^0-9]\]/

我有以下示例代码:

$example_message = 'Hi @[123456789] :)';

$msg = preg_replace('/\@\[[^0-9]\]/', '$1', $example_message);

但是它不起作用,它无法捕获 @[ ] 中的数字。有什么建议吗?谢谢。

3
你的问题在于字符类中的 ^ 符号是寻找负面匹配的(因此 [^0-9] 表示除数字外的任何字符)。真正的答案即将到来...... - Sam
1
此外,你的JS正则表达式应该是/@\[[0-9_]+\]/g(如果方括号内不应该有下划线,请删除下划线)。 - Jerry
2个回答

6
你的正则表达式存在一些核心问题,主要问题是 ^ 反转了你的字符类。所以,[^0-9] 匹配的不是数字,而是除了数字之外的任何内容。此外,PHP 中不存在 g 修饰符preg_replace() 全局替换,可以使用 preg_match_all() 进行全局匹配)。
你需要使用类似于 /@\[(\d+)\]/ 的正则表达式来匹配(带有一个组)在 @[] 之间的所有数字。
要在 PHP 中对字符串进行全局匹配,请使用 preg_match_all()
preg_match_all('/@\[(\d+)\]/', 'Hi @[123456789] :)', $matches);
var_dump($matches);

然而,如果您不依赖于匹配组(\d+)的话,您的代码将更加清晰。相反,您可以使用"lookarounds",例如:(?<=@\[)\d+(?=\])。另外,如果每个字符串只有一个数字,则应使用 preg_match() 而不是 preg_match_all()

注意:我故意让示例模糊并链接到大量文档,以便您可以更好地阅读/学习。如果您有任何问题,请询问。此外,如果您想要关于正则表达式的更好解释(特别是使用lookarounds的第二个正则表达式),请告诉我,我会很乐意详细说明。


3

如果您想要在PHP中实现类似Javascript中g修饰符的行为,请使用preg_match_all函数。否则请使用preg_match函数。

preg_match_all("/@\\[([0-9]+)\\]/", $example_message, $matches);

Explanation: / 是起始定界符
@ 匹配 at 符号
\\[ 匹配开方括号(元字符,需要转义)
( 开始捕获
[0-9] 匹配数字
+ 匹配前面的一次或多次
) 停止捕获
\\] 匹配闭方括号(元字符,需要转义)
/ 是结束定界符
现在,$matches[1] 包含方括号内的所有数字。

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