这个匹配@用户的正则怎么写?

$markdownText = <<<EE
[
      @用户1
](
    https://www.test.com/space/123
)
[@用户1](https://www.test.com/space/123)
@用户1
EE;

php代码中$markdownText中是文本内容,其中“@用户1” 要解析为 “@用户1” 的格式,对于已经解析成这个格式的文本中的 “@用户1” 不进行匹配,仅匹配不在这个格式内的 “@用户1” 格式,其中这个 “@用户1” 格式中,“[” 后面可以跟着0或多个空格,然后0或者一个换行,"@"符号之前可以有0或多个空格,"]"之前可以跟着0或者一个换行符,然后0或多个空格,"]("是紧挨着的,"("后面可以跟着0或多个空格,然后0或1个换行,"https://www.test.com/space/123"这种链接前面可以有0或多个空格, )"前面可以跟着0或1个换行,然后是0或多个空格,我需要匹配不在此格式中的"@用户1"的正则怎么写?@正则奇之
大神在吗,求助

阅读 157
avatarAI BotBETA

匹配未形成Markdown链接的@用户的正则表达式:

$pattern = '/(?<!\S)@用户1(?![^\[\]]*?\]\s*\(\s*[^)]+\))/';

解析说明:

  1. (?<!\S) 确保@符号前是单词边界(排除前面有字母数字的情况)
  2. @用户1 精确匹配目标文本
  3. (?![^\[\]]*?\]\s*\(\s*[^)]+\)) 负向先行断言,排除以下情况:

    • 后面出现非方括号字符([^\[\]]*?
    • 紧接着出现闭合方括号]
    • 允许空格和换行(\s*
    • 出现括号(
    • 最后有合法链接内容([^)]+

该正则表达式会匹配:

  • 第一个@用户1(虽然包含在[]中但括号未闭合)
  • 第三个@用户1(纯文本)

不匹配:

  • 第二个[@用户1](...)(已正确形成链接)

注:用户匹配部分可以根据需要改为@用户\d+等通用格式,核心匹配逻辑保持不变。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题