2011-07-05 4 views
0

내 코드 작업을 수행하지 못했습니다. PHP preg_replace 패턴 [[and]]

내가 이렇게 나에게 결과 "게으른 개"를 제공하는 [[]]에있는 모든 단어를 제거 할

$string = "the [[quick [[brown]] fox [jumps]] over the]] lazy dog"; 

문자열을 고려하십시오.

preg_replace('/\[\[(.*?)\]\]/s', '' ,$string)를 사용하여 나에게 결과를 줄 것이다 :

] 게으른 개

잘못된 것입니다. 누구든지이 문제를 해결할 수 있습니까?

+2

정규식이 아니면 대체 방법이 필요합니까? – Jrod

+0

정규식보다 빠른 대체 방법이 있으면 좋을 것입니다. – ralpu

답변

0

이 시도 :

preg_replace('/\[\[.*\]\]/s', '' ,$string) 
+0

이 표현은 욕심이 많으므로 게으른 개 [[this this]] " '[[brown]] 여우 [jump]]와 같은 것은 작동하지 않습니다. – efritz

+0

그게 효과가 있습니다. 그의 예제 문자열에 대해,하지만 [[빠른]] 갈색 [[여우]]에 대해서는 어떨까요? 너무 많이 대체 할 것입니다. –

+0

젠장, 네 말이 맞아. 균형 잡힌 쌍. –

0
/\[\[(?:(?:\[\[.*?\]\]|.)*?)\]\]/s 

수술의 차이는 (?:\[\[.*?\]\]|.)*?입니다. .*? 대신 대괄호로 묶은 문자열을 먼저 찾습니다. 실패하면 .을 시도합니다.

+0

이것은 단지 2 레벨까지만 작동합니다. [게으름 피우는 강아지에게] [[빠른 [[갈색]] 여우 [점프 [[또 다른 안쪽]]] – ralpu

+0

정규 표현식은 당신 같아서 인상적입니다 귀하의 키보드를 청소하려고했지만 실제로 물건 않습니다. – Cyclone

+0

@Ralpu, regex는 재귀적인 작업에는 적합하지 않습니다. 추가 레벨을 원한다면 .net으로 이동하지 않으려면 PHP로 작성해야 할 것입니다. .net regex 구현에는이 문제를 해결하는 데 사용할 수있는 추가 '깊이'기능이 있습니다. –

1

정규식으로하기가 어려울 것입니다. 나는 그것을 손으로하는 것이 좋습니다.

function replace_brackets($source) { 
    $result = ''; 
    $brackets = 0; 
    foreach (preg_split('/(\[\[|\]\])/', $source, -1, PREG_SPLIT_DELIM_CAPTURE) as $segment) { 
     if ($segment == '[[') { 
      $brackets++; 
     } else if ($segment == ']]') { 
      $brackets--; 
     } else if ($brackets == 0) { 
      $result .= $segment; 
     } 
    } 

    return $result; 
} 

echo replace_brackets("the [[quick [[brown]] fox [jumps]] over the]] lazy dog [[ta]] da\n");