2010-03-03 4 views
0

일부 중첩 태그와 일치하도록 regexp를 얻으려고합니다. (예, 파서를 사용해야하지만 입력이 정확할 것입니다.)RegExp를 사용하여 중첩 된 [quote]

예 :

Text. 
More text. 
[quote] 
First quote 
[quote] 
Nested second quote. 
[/quote] 
[/quote] 

의 내가 정규 표현식은 단순히 <blockquote>에 태그를 변경하려면 가정 해 봅시다 :

Text. 
More text. 
<blockquote> 
First quote 
<blockquote> 
Nested second quote. 
</blockquote> 
</blockquote> 

어떻게 동시에 열고 닫는 태그를 모두 일치하는,이 작업을 수행 할 것 ?

답변

2

You can't match (arbitrarily) nested stuff with regular expressions.

하지만 당신은 </blockquote><blockquote>[/quote][quote]의 모든 인스턴스를 대체 할 수 있습니다.

+2

경고 : 중첩 된 내용을 미리 결정된 깊이로 일치시킬 수 있습니다. http://blog.stevenlevithan.com/archives/regex-recursion – ghoppe

+0

"중첩 된 물건을 정규 표현식과 일치시킬 수 없습니다 (임의로)." 그게 내가 찾고 있던 대답이다. 그래서 나는 BBCode 파서를 사용했다 : http://nbbc.sourceforge.net/ – soupagain

3

정확성이 마음에 들지 않으면 간단한 문자열 교체를 사용하여 각 태그를 개별적으로 바꿀 수 있습니다. 여기에 여는 태그와 닫는 태그를 대체 할 PHP’s str_replace를 사용하여 몇 가지 예입니다

$str = str_replace('[quote]', '<blockquote>', $str); 
$str = str_replace('[/quote]', '</blockquote>', $str); 

또는 (PHP 다시) 정규 표현식의 도움으로

:

$str = preg_replace('~\[(/?)quote]~', '<$1blockquote>', $str); 
다음

\[(/?)quote]의 일치 <$1blockquote> 곳으로 대체됩니다 $1은 패턴의 첫 번째 그룹 ((/?), / 또는 비어 있음)과 일치시킵니다.

하지만 실제로는 여는 태그와 닫는 태그를 추적하는 파서를 사용해야합니다. 그렇지 않으면 중첩되지 않은 여는 태그 나 닫는 태그를 사용할 수 있습니다.

+0

OP가 PHP를 원하십니까? – kennytm

+0

@KennyTM : 아, 발언에 감사드립니다. 어떻게 PHP를 사용하기를 원한다고 나는 생각하지 않습니다. – Gumbo

1

그것은 형편없는 아이디어,하지만 당신은 분명히 같은 일치하려는 : \[\(/?\)quote\]와로 대체 : 당신은이 개 표현을 사용할 수 <\1blockquote>

1

.

s/\[quote\]/\<blockquote\>/ 
s/\[\/quote\]/\<\/blockquote\>/