>我正在尝试创建一个正则表达式模式,它将匹配以@
开头的字符串中的单词
解决这个初始问题的正则表达式是'~(@w+)~'
代码的第二个要求是它还必须忽略[quote]
和[/quote]
标记中发生的任何匹配项
失败的几次尝试是:
(?:[0-9]+|~(@w+)~)(?![0-9a-z]*[/[a-z]+])
/[quote[s]][sS]*?/quote](*SKIP)(*F)|~(@w+)~/i
示例:以下字符串应具有显示的数组输出:
$results = [];
$string = "@friends @john [quote]@and @jane[/quote] @doe";
//run regex match
preg_match_all('regex', $string, $results);
//dump results
var_dump($results[1]);
//results: array consisting of:
[1]=>"@friends"
[2]=>"@john"
[3]=>"@doe
您可以使用
以下正则表达式(基于另一个相关问题(:
'~([quote](?:(?1)|.)*?[/quote])(*SKIP)(*F)|@w+~s'
请参阅正则表达式演示。正则表达式占嵌套[quote]
标签。
详
-
([quote](?:(?1)|.)*?[/quote])(*SKIP)(*F)
- 匹配捕获括号内的模式,然后(*SKIP)(*F)
使正则表达式引擎省略匹配的文本:-
[quote]
- 文本[quote]
字符串 -
(?:(?1)|.)*?
- 整个组 1 模式 ((?1)
( 或任何字符 (.
( 的任何 0+(但尽可能少(出现 -
[/quote]
- 文本[/quote]
字符串
-
-
|
- 或 -
@w+
- 一个@
后跟 1+ 字字符。
PHP演示:
$results = [];
$string = "@friends @john [quote]@and @jane[/quote] @doe";
$rx = '~([quote](?:(?1)|.)*?[/quote])(*SKIP)(*F)|@w+~s';
preg_match_all($rx, $string, $results);
print_r($results[0]);
// => Array ( [0] => @friends [1] => @john [2] => @doe )