匹配不在 bbcode 标签内的正则表达式模式



>我正在尝试创建一个正则表达式模式,它将匹配以@开头的字符串中的单词

解决这个初始问题的正则表达式是'~(@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 )

最新更新