2014-07-17 2 views
0

그래서PHP preg_replace가 여러 공백과 일치하지 않습니다.

기존 HTML이 있습니다. 정규식을 사용하여 크래프트를 제거하려고합니다.

<div class="al-list-head"><span>Another List</span></p> 
<h3>Destinations</h3> 
</div> 

같은 것이 HTML의 또 다른 변종

<div class="al-list-head"> 
<p><span>Another List</span></p> 
<h3>Lounge</h3> 
</div> 

수 (CMS는 때로는 중복 <p> 년대에 추가).

내 정규 표현식은 대부분 (두 번째 샘플) 작동하지만 첫 번째는 작동하지 않습니다. 나는 많은 문자 클래스를 시도했지만 첫 번째 샘플에서 마지막 </h3>과 마지막 </div> 사이의 갭을 일치시키는 것처럼 보이지 않습니다.

내 정규식은 ...

$html = preg_replace('/<div class=\"al-list-head\">[\s](<p>?)(<span>Another\ List<\/span>)(<\/p>?)[\s]<h3>([^<\/>]*)<\/h3>[\s]<\/div>/is', '<h3 class="al-head">$4</h3>', $html); 

<\h3> 후 나는 [\s], ([\s]?), ([\s\b\n\r]*)과 행운 심지어 (.*)을 시도했습니다.

모든 포인터?

나는 이것을 사용하여 반복하고 테스트하기 때문에 handy little tool이 유용하다는 것을 알기를 바랍니다.

+1

추가보십시오 'm' 수식어 넣기 : 당신의 정규식은'/ is'로 끝나고'/ ism'을 시도해보십시오. – ljacqu

+0

@dangvy 예상되는 결과는 무엇입니까? –

+0

명령이 작동합니다. http://regex101.com/r/wN4wB7/2 –

답변

1

사용 \s*

$html = preg_replace('/<div class=\"al-list-head\">\s*(<p>?)(<span>Another\ List<\/span>)(<\/p>?)\s*<h3>([^<\/>]*)<\/h3>\s*<\/div>/is', '<h3 class="al-head">$4</h3>', $html); 
+0

Spot on - 감사합니다. – dangvy

0

당신은 아래 정규식을 시도 할 수 있습니다, 그것은 모두 예를 들어 작품,

/<div\s*class=\"al-list-head\">\s*(<p>)?(<span>Another\s*List<\/span>)(<\/p>)?\s*<h3>([^<\/>]*)<\/h3>\s<\/div>/img 

교체 문자열 수 :

<h3 class="al-head">$4</h3> 

DEMO

관련 문제