2011-06-15 6 views
3

다중 문자열까지의 내용에 맞게 ...정규 표현식 내가 그 다음과 같습니다 오는 결함이 입력을 가지고

foo<p>bar</p> 

그리고 AP 태그에서 최고의 텍스트를 포장을 정상화하려면 :

<p>foo</p><p>bar</p> 

<p>$1</p>/^([^<]+)/의 대체 정규식 충분히 쉽다.

foo <b>bold</b><p>bar</p> 

이 새로운 페이지에서 전체 덩어리 포장한다 :

<p>foo <b>bold</b></p><p>bar</p> 

을하지만 간단한 정규식 < 만 보이는 때문에 문제는 때때로 주요 덩어리과 같이 페이지가 아닌 다른 태그를 포함입니다 그것은 <b>에서 멈추고 밖으로 뱉어 :

<p>foo </p><b>bold</b><p>bar</p> <!-- oops --> 

을 그래서 <p 일치하는 정규 표현식을 다시 어떻게? 명백하게 대답은 부정적 예측을 포함하지만, this은 나에게 너무 깊은 것입니다.

(그리고 "당신이 정규 표현식에와 HTML을 구문 분석 할 수 없습니다!"코멘트를 피할 수는 입력하지 임의 HTML,하지만 태그 <p>, <a>, <b><i>을, 그리고 A/B로 주석을 일반 텍스트 전에/나는 중첩되지 않을 수 있습니다.)

+2

+1. –

답변

3

실제로 생각하십니까 긍정적 인 lookahead. 정말 나쁘지 않아 :

/^([^<]+)(?=<p)/ 

당신은 단지 있는지 확인하려면 그 <p이지만, 실제로 <p를 소비하지 않기 때문에 당신이 내다을 사용한 후에 오는 뭐든간에.

예 :

> var re = /^([^<]+)(?=<p)/g; 

> 'foo<p>bar</p>'.replace(re, '<p>$1</p>'); 
    "<p>foo</p><p>bar</p>" 

> 'foo <b>bold</b><p>bar</p>'.replace(re, '<p>$1</p>') 
    "foo <b>bold</b><p>bar</p>" 

죄송합니다, 내 원래의 게시물에서 충분히 명확하지 않았다 : 나의 기대는 "foo는 대담"비트는 또한 새로운 p 태그에 싸여받을 것이라고했다, 그리고 그것은 일어나지 않습니다.

또한 지금은 p 태그가없는 입력이 있습니다 (단지 foo 일반).이 또한 <p>foo</p>으로 매핑되어야합니다.

이 작업을 얻는 가장 쉬운 방법은 2 개의 별도 정규식 /^(.+?(?=<p))//^([^<]+)/을 사용하는 것입니다.

> var re1 = /^(.+?(?=<p))/g, 
     re2 = /^([^<]+)/g, 
     s = '<p>$1</p>'; 

> 'foo<p>bar</p>'.replace(re1, s).replace(re2, s); 
    "<p>foo</p><p>bar</p>" 

> 'foo'.replace(re1, s).replace(re2, s); 
    "<p>foo</p>" 

> 'foo <b>bold</b><p>bar</p>'.replace(re1, s).replace(re2, s); 
    "<p>foo <b>bold</b></p><p>bar</p>" 

re1re2을 결합하여 하나의 상응하는 정규 표현식을 쓸 수있다 : 바로 마지막 문장에 대한
/^(.+?(?=<p)|[^<]+)/

> var re3 = /^(.+?(?=<p)|[^<]+)/g, 
     s = '<p>$1</p>'; 

> 'foo<p>bar</p>'.replace(re3, s) 
    "<p>foo</p><p>bar</p>" 

> 'foo'.replace(re3, s) 
    "<p>foo</p>" 

> 'foo <b>bold</b><p>bar</p>'.replace(re3, s) 
    "<p>foo <b>bold</b></p><p>bar</p>" 
+0

미안하지만, 내 원래 게시물에 충분히 명확하지 않았다 : 나의 기대는 "foo bold"비트가 새로운 p 태그로 감싸 져서 일어나지 않을 것이라는 것이었다. – jpatokal

+0

또한 모든 p 태그가없는 입력 (그냥'foo' 만)이 있으며 '

foo

'에도 매핑해야합니다. – jpatokal

+0

기본 개념은 텍스트를 항상 단락으로 묶어야한다는 것입니다. 두 regexp 스타일 잘 작동합니다, 감사합니다! – jpatokal