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拖得太久了。