Php 正则表达式,用于不以2个开大括号和闭大括号开头和结尾的字符串

Php 正则表达式,用于不以2个开大括号和闭大括号开头和结尾的字符串,php,regex,regex-negation,regex-lookarounds,Php,Regex,Regex Negation,Regex Lookarounds,我试图找到一个PHP正则表达式,它可以匹配任何字符串,除了在开头有两个开放的花括号,在结尾有两个闭合的花括号的字符串 因此,除了具体的: {{someString}} 字符串可以没有大括号,只要它在字符串的开始和结束处不是2开2闭 到目前为止,我最好的尝试是 ^(?!{{).+(?!}})$ 但是我后来意识到这不匹配像{{x(因为它以{{开头)这样的字符串;我确实希望该字符串匹配,而不是像{{x}}这样的字符串 如何解决此问题?您可以写: ^(?!{{.*}}$) 匹配任何不匹配的对象 ^

我试图找到一个PHP正则表达式,它可以匹配任何字符串,除了在开头有两个开放的花括号,在结尾有两个闭合的花括号的字符串

因此,除了具体的:

{{someString}}
字符串可以没有大括号,只要它在字符串的开始和结束处不是2开2闭

到目前为止,我最好的尝试是

^(?!{{).+(?!}})$
但是我后来意识到这不匹配像
{{x
(因为它以
{{
开头)这样的字符串;我确实希望该字符串匹配,而不是像
{{x}}
这样的字符串

如何解决此问题?

您可以写:

^(?!{{.*}}$)
匹配任何不匹配的对象

^{{.*}}$

从另一端解决问题…
我们确切地知道什么不应该“通过”…规则很简单:

{{whatever or nothing between double curly brackets}}
那么,为什么不尝试匹配这个简单的规则并扣除结果呢

当没有匹配项时,字符串为OK

将下面的代码粘贴到:


您展示的示例并不都以“{{”开头,也不都以“}}”结尾。您不明白这一点。您确定关于“应该匹配”的最后一段与您的第一句话一致吗?也就是说,您不是在寻求匹配第二个列表而使第一个列表失败吗?换句话说,为什么不使用
^{.*}$
与第二个列表匹配(例如,
{{…}
等)在第一段中失败,并过滤任何与之匹配的内容,而不是相反的内容?还有,你的PHP代码是什么样的,或者你是什么样的?很抱歉“filters out”(过滤掉)这个含糊不清的措辞。我的意思是“Not match”(不匹配)。最后一段是我想要的。大括号是正则表达式中的特殊字符。也许你应该尝试转义它们不匹配{a}@拉维:为什么不呢?问题是没有捕获组。我想你实际上想要
^(?!{.+})(.*)$
@Nick:为什么需要有一个捕获组?否则就没有匹配的组,所以不会报告匹配。尝试从正则表达式中删除捕获组,您会看到它报告正则表达式不匹配任何内容。谢谢!我在别处尝试过这种黑名单方法。但是在这种情况下,因为我被迫使用Laravel在5.4的正则表达式验证中,我必须使用白名单方法
<?php
echo "<h1>Strings 0 to 5 should pass and the rest should fail.</h1>";

// Should pass
$string[0] = "test";
$string[1] = "{test";
$string[2] = "test}";
$string[3] = "{test}";
$string[4] = "{{test}";
$string[5] = "{test}}";

// Should fail
$string[6] = "{{test}}";
$string[7] = "{{test}}}";
$string[8] = "{{{test}}";
$string[9] = "{{{test}}}";
$string[10] = "{{}}";

$pattern = "/[\{]{2}.*[\}]{2}/";
for($i=0; $i<sizeof($string);$i++){
    echo $i." - String is: <b>".$string[$i]."</b><br>";
    // --------
    preg_match($pattern,$string[$i],$matches);
    if($matches==null){
        echo "<span class='pass'>That string is ok.</span><br>";
    }else{
        echo "<span class='fail'>That string is NOT ok.</span><br>";
    }
    echo "<br><br>";
}
?>
<style>
    .pass{
        color:green;
    }
    .fail{
        color:red
    }
</style>