PHP正则表达式:匹配非转义字符组

时间:2016-05-15 01:10:10

标签: php regex string escaping

好的,所以我一直试图弄清楚这一点,在PHP中使用各种正则表达式。我有一个这样的字符串:

$str = "this is a(n) {item} made by {username}. Watch out for \\{escaped} items. This one is \\\\{notescaped}.";

我需要捕获花括号包围的非转义组。我计划使用preg_split将组中的字符串(包括花括号)拆分为数组,以便稍后我可以使用所需信息填充空白。

所以结果应该是:

// After preg_split
array (
    [0] => "this is a(n) ",
    [1] => " made by ",
    [2] => ". Watch out for {escaped} items. This one is \\",
    [3] => "."
);

// Captured delimiters from preg_split
array(
    [0] => "{item}",
    [1] => "{username}",
    [2] => "{notescaped}",
);

我知道如何使用基本\{.*\}来捕获群组,但我需要确保它不会被转义。所以类似\\\\\\{escaped}(3个反斜杠)之类的东西仍会逃脱它。花括号内的字符也可以是任何字符,没有特定的,也不需要检查是否有任何转义。对此有任何帮助非常感谢!

1 个答案:

答案 0 :(得分:1)

反斜杠很难用,但是这会在“未转义”的大括号之间找到所有内容:

(?<=^|[^\\])(?:[\\]{4})*[{]([^}]*)[}]

作为一个字符串,它变成了这个怪物:

$re = "~(?<=^|[^\\\\])(?:[\\\\]{4})*[{]([^}]*)[}]~s";

基本上,它确保括号前有偶数个反斜杠。