我有包含这个的字符串(其中数字是表示用户ID的整数)
@[calbert](3) @[username](684684)
字符串我想我需要以下内容来获取用户名和用户ID
\((.*?)\)
型和/或
\[(.*?)])
型但有没有办法同时做到这两点呢?并且PHP返回,有没有可能只得到没有括号的结果(在用户名的情况下还有括号)
Array ( [0] => (3) [1] => 3 )
型
2ic8powd1#
\[([^\]]*)\]|\(([^)]*)\)
字符串试试这个。你需要使用|或operator。这使得正则表达式引擎在第一个捕获组失败时提供交替的捕获组。https://regex101.com/r/tX2bH4/31
|
$re = "/\\[([^\\]]*)\\]|\\(([^)]*)\\)/im"; $str = " @[calbert](3)\n @[username](684684)"; preg_match_all($re, $str, $matches);
型或者你可以使用自己的正则表达式。\((.*?)\)|\[(.*?)\])个
\((.*?)\)|\[(.*?)\])
d5vmydt92#
通过正向lookbehind和lookaheadAssert。
(?<=\[)[^\]]*(?=])|(?<=\()\d+(?=\))
字符串
(?<=\[)
[
[^\]]*
]
(?=])
DEMO
2条答案
按热度按时间2ic8powd1#
字符串
试试这个。你需要使用
|
或operator。这使得正则表达式引擎在第一个捕获组失败时提供交替的捕获组。https://regex101.com/r/tX2bH4/31
型
或者你可以使用自己的正则表达式。
\((.*?)\)|\[(.*?)\])
个d5vmydt92#
通过正向lookbehind和lookaheadAssert。
字符串
(?<=\[)
Assert匹配必须在[
字符前,[^\]]*
匹配任何字符,但不匹配]
零次或多次。(?=])
声明匹配必须后跟]
符号。|
调用逻辑OR运算符,用于合并两个正则表达式。DEMO