2010-05-26 6 views
3

저는 내 웹 사이트에 대한 BBcode 작업을하고 있습니다.Regex & BBCode - 중첩 견적을 완벽하게합니다.

[QUOTE] 태그를 사용하면 대부분의 코드가 제대로 작동하지 않을 수 있습니다.

[QUOTE=1] 
[QUOTE=2] 
This is a quote from someone else 
[/QUOTE] 
This is someone else quoting someone else 
[/QUOTE] 

그것은 반환합니다 :

그래서 무슨 일이 일어나고하면 [/ 인용]입니다
> 1 said: [QUOTE=2]This is a quote from 
> someone else 

This is someone else quoting someone else[/QUOTE] 

중첩 된 따옴표에서 인용 블록을 닫고

나는 이런 식으로 뭔가를 얻을 때. 내가 사용하고

정규식은 다음과 같습니다

"[quote=(.*?)\](.*?)\[/quote\]'is" 

가 어떻게 그렇게 중첩 된 따옴표가 제대로 표시 할 수 ?

감사합니다.

답변

2

당신은 (자신의 변경 내역에 따라 libpcre - 3.0부터 사용 가능) 재귀 정규 표현식을 구성 할 수있다. (?R) 여기«(?R)가 발생하는 위치 장소에서 전체 정규 표현식을 삽입»을 의미 업데이트

. 따라서 a(?R)?b은 (이는 그룹 캡처에 대해 잊어 버린 경우)과 동일합니다. 이는 a(a(a(?-1)?b)?b)?b과 같습니다.(?R) 대신 (?N), (?+N), (?-N)(?&a)을 사용할 수 있습니다. 이는 "N 번째 캡처 그룹으로 대체", "N 번째 다음 캡처 그룹으로 대체", "N 번째 이전 캡처 그룹으로 대체"및 다음으로 대체하십시오. «a»»라는 이름의 캡쳐 그룹.

+0

재귀 Regex 들어 본 적이. 어떻게 작동합니까? – Moe

+0

잘 작동하지만 HTML 태그의 따옴표 안에있는 정규식을 변경하지 않습니다 – Moe

+0

모든 인용 부호를 변경하려면 일치하는 동안이 정규식을 다시 적용해야합니다. 각 반복마다 약간의 심도 변수를 증가시킬 수 있습니다. – ZyX

0

정규식이 좋은 것은 아닙니다. 그것은

... 거의 정규 표현식, and we know what happens when you do that와 HTML을 구문 분석하는 노력 등이 무엇 당신 할, 심지어 그때 나는 모든 위대한 아이디어의 분할 preg_split을 사용하는 것입니다 생각하지 마십시오 텍스트를 태그 및 비 태그로 입력하십시오. 그래서 당신은 같은 목록이 될 겁니다 :

  • [QUOTE = 1]
  • (빈)
  • [QUOTE = 1] 다른 사람에서 인용 한 것입니다
  • [/ QUOTE]
  • 이 누군가 다른 사람은 인용
  • [/ QUOTE]

그런 다음 태그를 HTML로 변환하고 일반 텍스트를 수정하지 않고 출력하는 목록을 실행합니다. 심지어 예상치 못한 상황에서 "[/ 인용구]"를 만나면 잘못된 HTML을 출력하는 것보다 상황을 조금 더 잘 처리 할 수 ​​있도록 멋지게 꾸며보고 "중첩"수를 유지할 수도 있습니다. 또는, 물건을 찾으면 출력하고 나중에 HTMLPurify 또는 무엇인가 정리하도록하십시오.

\[quote=(.*?)\](((?R)|.)*?)\[\/quote\] 

을하지만 @codeka 조언을 따르는 경우에 더 나은 것 :

+0

흠, 나 한번 해봐. 이것에 대한 쉬운 해결책이있는 것처럼 보이지 않습니다! – Moe