2011-09-09 50 views
0

我意識到之前曾經有類似的問題,但我似乎無法解決我正在嘗試做的事情,所以請不要只是認爲這是一個騙局。否定正則表達式中的字符串

我在風格{block:string}contents{/block:string}一個字符串,它可以與{block:([a-z_-\s]+)}.*{/block:\1}

很容易被匹配什麼我想要做的就是修改內。*的一部分,以便它匹配具有任何字符串它們之間的{block:[a-z_-\s]+},即所有{block} {/ block}裏面的{block}都不應該匹配。

謝謝!

回答

2

嘗試

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

我在正則表達式姿色平平,但負先行所界定的[^ {] *和[^}] *語句應該保留匹配標籤免費。

+0

不行的話恐怕:( – Meep3D

+0

是它未能匹配或PHP的正則表達式給你一個錯誤? –

+0

不匹配任何東西:( – Meep3D

2

壓縮: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"; 
} 

輸出:
匹配 '{塊:串} NTS {/塊:串}'

+0

+1。以下是PHP版本:** [demo](http://ideone.com/TY8WV)** –

+0

感謝Alan。應該咬緊牙關,一直在推遲PHP long – sln

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

例如:

$str = "{block:string}test2{/block:string} {block:string}contents{block:string}{block:string}test3{/block:string}{/block:string}{/block:string} sdf "; 

將產生:

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

我不知道他的backref是否很重要,但是你的正則表達式匹配'「{block:stringa} nts {/ block:string}」' – sln

+0

我假設(也許不正確)返回引用是嘗試在嵌套時匹配標籤,你可能是正確的:{block:abc} content {/ block:def}'可能存在並且是無效的,如果是這樣,現在他知道它需要被修復。 –