php 从字符串捕获两个正则表达式

vhipe2zx  于 2023-08-02  发布在  PHP
关注(0)|答案(2)|浏览(93)

我有包含这个的字符串(其中数字是表示用户ID的整数)

@[calbert](3)
  @[username](684684)

字符串
我想我需要以下内容来获取用户名和用户ID

\((.*?)\)


和/或

\[(.*?)])


但有没有办法同时做到这两点呢?
并且PHP返回,有没有可能只得到没有括号的结果(在用户名的情况下还有括号)

Array
    (
[0] => (3)
[1] => 3
     )

2ic8powd

2ic8powd1#

\[([^\]]*)\]|\(([^)]*)\)

字符串
试试这个。你需要使用|或operator。这使得正则表达式引擎在第一个捕获组失败时提供交替的捕获组。
https://regex101.com/r/tX2bH4/31

$re = "/\\[([^\\]]*)\\]|\\(([^)]*)\\)/im";
$str = " @[calbert](3)\n @[username](684684)";
 
preg_match_all($re, $str, $matches);


或者你可以使用自己的正则表达式。\((.*?)\)|\[(.*?)\])

d5vmydt9

d5vmydt92#

通过正向lookbehind和lookaheadAssert。

(?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\))

字符串

  • (?<=\[)Assert匹配必须在[字符前,
  • [^\]]*匹配任何字符,但不匹配]零次或多次。
  • (?=])声明匹配必须后跟]符号。
  • |调用逻辑OR运算符,用于合并两个正则表达式。

DEMO

相关问题