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

时间:2014-04-05 06:04:09

标签: php regex

我目前正在构建一个具有回复功能的聊天系统。

如何匹配'@'符号和括号内的数字,例如:@ [123456789]

这个适用于JavaScript

/@\[(0-9_)+\]/g

但它在PHP中不起作用,因为它无法识别 / g 修饰符。所以我尝试了这个:

/\@\[[^0-9]\]/

我有以下示例代码:

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

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

但它不起作用,它不会捕获@ []内的那些数字。有什么建议?感谢

2 个答案:

答案 0 :(得分:5)

你的正则表达式中有一些核心问题,主要的是^否定你的角色类。因此,它不是[^0-9]匹配任何数字,而是匹配任何数字。此外,g modifier在PHP中不存在(preg_replace()全局替换,您可以使用preg_match_all()全局匹配表达式。

您希望使用/@\[(\d+)\]/这样的正则表达式来匹配(与群组)@[]之间的所有数字。

要在PHP中使用字符串全局执行此操作,请使用preg_match_all()

preg_match_all('/@\[(\d+)\]/', 'Hi @[123456789] :)', $matches);
var_dump($matches);

但是,如果您不依赖匹配组(\d+),您的代码会更清晰。相反,你可以使用&#34; lookarounds&#34;像:(?<=@\[)\d+(?=\])。另外,如果每个字符串只有一个数字,则应使用preg_match()而不是preg_match_all()

注意:我将示例模糊不清并链接到大量文档,以便您可以更好地阅读/学习。如果您有任何问题,请询问。另外,如果你想对所使用的正则表达式(特别是第二个带有外观的表达式)有更好的解释,请告诉我,我很乐意详细说明。

答案 1 :(得分:1)

如果您想在Javascript中生成g修饰符的行为,请使用PHP中的preg_match_all函数。否则请使用preg_match功能。

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

<强>解释
/开头分隔符
@匹配at符号
\\[匹配开头方括号(元字符,因此需要转义)
(开始捕获 [0-9]匹配数字
+与前一次或多次匹配 )停止捕获 \\]匹配结束方括号(元字符,因此需要转义)
/结算分隔符

现在$matches[1]包含方括号内的所有数字。