2010-06-17 12 views
2

나는 HTML에 BBcode 변환기를 쓰고있다.
변환기는 닫히지 않은 태그를 건너 뜁니다.
1) 번과 같이, 하나의 정규식 호출을 사용하여 모든 태그를 일치 :Regex BBCode to HTML

나는 그것을 할 약 2 옵션을 생각

Regex re2 = new Regex(@"\[(\ /?(?:b|i|u|quote|strike))\]"); 
MatchCollection mc = re2.Matches(sourcestring); 

을 한 후, 2 포인터를 사용을 MatchCollection 돌이가 시작 오픈 찾아 태그 및 오른쪽 html 태그로 바꾸기보다.

2) 모든 태그에 정규식 여러 시간에 전화를 직접 교체 :

Regex re = new Regex(@"\[b\](.*?)\[\/b\]"); 
string s1 = re.Replace(sourcestring2,"<b>$1</b>"); 

을보다 효율적으로 무엇입니까?

첫 번째 옵션은 하나의 정규식을 사용하지만 모든 태그를 반복하고 모든 쌍을 찾고 한 쌍이없는 태그는 건너 뜁니다.
또 하나의 긍정적 인 점은 내가 태그 사이의 내용에 신경 쓰지 않는다는 것입니다. 단지 작업하고 위치를 사용하여 바꿉니다.

두 번째 옵션에서는 루핑 및 특수 바꾸기 기능에 대해 걱정할 필요가 없습니다.
그러나 여러 정규 표현식과 대체 코드를 실행해야합니다.

무엇을 제안 할 수 있습니까? 나는 또한 같은 멀티 라인에 맞게 문제를 해결할 수있는 방법을 정규식 \[b\](.*?)\[\/b\]

에 문제가있는 것입니다

두 번째 옵션이 올바른 경우, :

[b] 
     test 1 
[/b] 

[b] 
     test 2 
[/b] 

답변

1
r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline); 

var s = r.Replace("asdfasdf[b]test[/b]asdfsadf", "<b>$1</b>"); 

가 그 닫는 태그와 일치하는 요소 만 제공하고 여러 줄을 처리해야합니다 (SingleLine 옵션을 지정하더라도 실제로 한 줄로 취급 함)

첫 번째 [b]를 무시하여 [b] [b] [/ b]를 올바르게 처리해야합니다.

이 방법이 첫 번째 방법보다 나은지 여부는 말할 수 없습니다. 그러나 바라건대 이것은 올바른 방향으로 당신을 가리킬 것입니다.

아래 예제에서 작동하는 코드 : System.Text.RegularExpressions.Regex r; 대신 당신이 [을 찾아 특정 정규식을 찾고에, 다음 프로그램도 어떤 방식에서 ] 찾는 것을 처리가 어디

r = new System.Text.RegularExpressions.Regex(@"(?:\[b\])(?<name>(?>\[b\](?<DEPTH>)|\[/b\](?<-DEPTH>)|.)+)(?(DEPTH)(?!))(?:\[/b\])", System.Text.RegularExpressions.RegexOptions.Singleline); 

var s = r.Replace("[b]bla bla[/b]bla bla[b] " + "\r\n" + "bla bla [/b]", "<b>$1</b>"); 
+0

문자열과 같이 작동하지 않습니다. "[b] bla bla [/ b] bla bla [b]"+ "\ r \ n"+ "bla bla [/ b]"; – ilann

+0

정확한 코드로 테스트를 해보니 문제가 될 수 있는지 잘 모르겠습니다. 하지만 위의 코드를 복사하여 확인할 수 있다면 :) 편집 : 내 대답을 코드로 이동 – Buildstarted

2

하나의 옵션은 것을 처리, 더 SAX와 같은 구문 분석을 사용하는 것입니다 정규 표현식보다 더 장황 할지라도, 이해하기가 더 쉽고 반드시 더 느릴 필요는 없습니다.