PHP正则需求:匹配不在链接内的@用户(含开头@用户)
PHP正则匹配@用户(排除链接内的@)
需求匹配规则
需要匹配符合以下两个条件的@用户:
- 不在http/https链接内部
- 位于字符串开头或空白字符之后
解决正则表达式
$regex = '/(?:^|\s)(?<!https?:\/\/\S*)@([a-zA-Z0-9-_]+)/';
正则各部分解释
(?:^|\s):匹配字符串开头或空白字符(非捕获组,仅用于定位,不捕获该部分内容)(?<!https?:\/\/\S*):负向回顾断言,确保当前@符号的前面不是http/https链接的一部分(排除链接内的@)@([a-zA-Z0-9-_]+):匹配@符号及后续的用户ID,将用户ID捕获到分组1中
替换示例代码
// 原始字符串 $content = "@user1 sent a link http://localhost/@dummy/video/7079513184146607365 to @user3"; // 正则替换,将@用户转为跳转链接 $processedContent = preg_replace( '/(?:^|\s)(?<!https?:\/\/\S*)@([a-zA-Z0-9-_]+)/', '$0<a href="/profile/$1">@$1</a>', $content ); echo $processedContent;
效果说明
运行上述代码后,会将字符串中的@user1和@user3替换为指定链接,而链接内部的@dummy会被自动排除,不会被匹配替换。
扩展调整
- 如果需要支持其他协议的链接(如ftp://),可将正则中的
https?:\/\/修改为(https?:\/\/|ftp:\/\/) - 如果用户ID允许其他字符(如
.),可将字符范围[a-zA-Z0-9-_]调整为[a-zA-Z0-9-_.]
内容的提问来源于stack exchange,提问作者joe
相关产品推荐
相关产品推荐

