2011-09-09 4 views
0

비슷한 것을 이전에 물어 봤지만, 내가하려고하는 것에 솔루션을 맞출 수없는 것 같아요. 그래서 이것이 속는 사람이라고 생각하지 마십시오.정규식에서 문자열의 부정 (Negation)

나는 내가하고 싶은 것은 내부를 수정입니다 {block:([a-z_-\s]+)}.*{/block:\1}

으로 비교적 쉽게 매치 할 수있는 스타일 {block:string}contents{/block:string} 문자열을 보유하고 있습니다. * 부분이 하지 경기 A가 들어있는 문자열을 않도록 {block:[a-z_-\s]+} 사이에 {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

예 :

$_ = '{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 버전입니다 : ** [데모] (http://ideone.com/TY8WV) ** –

+0

감사합니다. Alan. 총알을 물지 마세요. 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

역 참조가 중요하지만 정규 표현식이''{block : stringa} nts {/ block : string} ''와 일치하지 않는다고 말할 수 없다. " – sln

+0

나는 뒤쪽 참조가 {block : abc} content {/ block : def}'가 존재할 수 있고 유효하지 않을 수도 있습니다. 그렇다면 이제는 수정이 필요하다는 것을 알고 있습니다. :) –