Php 正则表达式中字符串的求反

Php 正则表达式中字符串的求反,php,regex,regex-negation,Php,Regex,Regex Negation,我意识到以前也有人问过类似的问题,但我似乎无法将解决方案与我正在尝试的工作相匹配,所以请不要仅仅认为这是一个骗局 我有一个样式为{block:string}contents{/block:string}的字符串,它可以很容易地与{block:([a-z\s]+)}.*{/block:\1} 我想做的是修改内部.*部分,使其不匹配任何之间有{block:[a-z_-\s]+}的字符串,也就是说,所有内部有{block}{/block}的{block}都不应该匹配 谢谢 试试看 {block:([a

我意识到以前也有人问过类似的问题,但我似乎无法将解决方案与我正在尝试的工作相匹配,所以请不要仅仅认为这是一个骗局

我有一个样式为
{block:string}contents{/block:string}
的字符串,它可以很容易地与
{block:([a-z\s]+)}.*{/block:\1}

我想做的是修改内部.*部分,使其不匹配任何之间有
{block:[a-z_-\s]+}
的字符串,也就是说,所有内部有{block}{/block}的{block}都不应该匹配

谢谢

试试看

{block:([a-z_-\s]+)}[^{]*(?!{block:([a-z_-\s]+)}.*{\block:\2})[^}]*{/block:\1}
我在正则表达式方面相当平庸,但是由[^{]*和[^}]*语句限定的负前瞻应该可以让您的匹配标记保持自由。

试试看

{block:([a-z_-\s]+)}[^{]*(?!{block:([a-z_-\s]+)}.*{\block:\2})[^}]*{/block:\1}

我在正则表达式方面相当平庸,但是由[^{]*和[^}]*语句限定的负前瞻应该可以让您的匹配标记保持自由。

压缩:
m~\{block:([a-z\s\-]+)\}(?:(?!{/?block:\1})。*{/block:\1\}~xs

Perl中的示例:

$_ = '{block:string}conte{block:string}nts{/block:string}{/block:string}';

if ( m~    # match operator

        \{block: ([a-z\s_-]+) \}   # opening block structure and capt grp 1

        (?:                        # begin non capt grp
            (?! \{/?block: \1 \} )     # negative lookahead, don't want backreffed
                                       # open or closed block struct    
            .                          # ok, grab this character
        )*                         # end group, do 0 or more times (greedy)

        \{/block: \1 \}            # closing block structure matching grp 1 

  ~xs )    # modifiers: expanded, include newlines 

{
   print "matched '$&'\n";
}
输出:

匹配的“{block:string}nts{/block:string}”压缩:
m~\{block:([a-z\s\-]+)\}(?:(?!\{/?block:\1\})。*\{/block:\1\}~xs

<?php 
$ptn = "%(?:{block:[a-z_\s-]+})(?![^}]*?{block:).*?{/block:[a-z_\s-]+}%";
$str = "... your content here ...";
preg_match_all($ptn, $str, $matches);
print_r($matches);
?>
Perl中的示例:

$_ = '{block:string}conte{block:string}nts{/block:string}{/block:string}';

if ( m~    # match operator

        \{block: ([a-z\s_-]+) \}   # opening block structure and capt grp 1

        (?:                        # begin non capt grp
            (?! \{/?block: \1 \} )     # negative lookahead, don't want backreffed
                                       # open or closed block struct    
            .                          # ok, grab this character
        )*                         # end group, do 0 or more times (greedy)

        \{/block: \1 \}            # closing block structure matching grp 1 

  ~xs )    # modifiers: expanded, include newlines 

{
   print "matched '$&'\n";
}
输出:
匹配的“{block:string}nts{/block:string}”

<?php 
$ptn = "%(?:{block:[a-z_\s-]+})(?![^}]*?{block:).*?{/block:[a-z_\s-]+}%";
$str = "... your content here ...";
preg_match_all($ptn, $str, $matches);
print_r($matches);
?>
将产生:

Array
(
[0] => Array
    (
        [0] => {block:string}test2{/block:string}
        [1] => {block:string}test3{/block:string}
    )
)
将产生:

Array
(
[0] => Array
    (
        [0] => {block:string}test2{/block:string}
        [1] => {block:string}test3{/block:string}
    )
)

是不匹配还是PHP的正则表达式给了你一个错误?是不匹配还是PHP的正则表达式给了你一个错误?我不知道他的backref是否重要,但是你的正则表达式匹配
“{block:stringa}nts{/block:string}”
我假设(可能不正确)back引用是在嵌套标记时尝试匹配标记的结果。您可能是对的,
{block:abc}内容{/block:def}
可能存在并且无效。如果是这样的话,他现在意识到需要修复它。:)我不知道他的backref是否重要,但是您的正则表达式匹配
“{block:stringa}nts{/block:string}”
我假设(可能是错误的)back引用是在嵌套标记时尝试匹配标记的结果。您可能是对的,
{block:abc}内容{/block:def}
可能存在并且无效。如果是这样的话,他现在意识到需要修复它。:)谢谢你,艾伦。应该咬紧牙关,把PHP拖得太久了。谢谢Alan。应该咬紧牙关,把PHP拖得太久了。