我目前正在构建一个具有回复功能的聊天系统。
如何匹配'@'符号和括号内的数字,例如:@ [123456789]
这个适用于JavaScript
/@\[(0-9_)+\]/g
但它在PHP中不起作用,因为它无法识别 / g 修饰符。所以我尝试了这个:
/\@\[[^0-9]\]/
我有以下示例代码:
$example_message = 'Hi @[123456789] :)';
$msg = preg_replace('/\@\[[^0-9]\]/', '$1', $example_message);
但它不起作用,它不会捕获@ []内的那些数字。有什么建议?感谢
答案 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]
包含方括号内的所有数字。