2014-02-13 2 views
0

제목 속성 IMG 태그를 교체 :나는 다음과 같은 내용이 HTML 문자열이

<p>your name : 
<img title="##name##" src="name.jpg"/></p> 
<p>your lastname: 
<img title="##lastname##" src="lastname.jpg"/></p> 
<p>your email : 
<img title="##email##" src="email.jpg"/></p> 
<p>submit 
<img title="submit" src="submit.jpg"/></p> 

지금 나는 (그들이 ## 태그 한 쌍 안에 표시) 모든 제목의 특성을 추출 할을하고, 제거 <img> 태그를 찾아 추출 된 제목으로 대체하십시오.

결과는 다음과 같아야합니다

이 작업을 수행하는 가장 좋은 방법은 무엇입니까
<p>your name : 
##name##</p> 
<p>your lastname: 
##lastname##</p> 
<p>your email : 
##email##</p> 
<p>submit 
<img title="submit" src="submit.jpg" title="submit"/></p> 

?

starts with "<img", then contains "##", then 1 or more characters, then "##", and ends with ">" 그런 다음 그 추출 된 블록에 당신이 starts with "##", then 1 or more characters, then ends with "##" 그 부분을 찾으려면 :

답변

1

이 작업을 수행하려면 HTML 구문 분석기를 사용하십시오.

$dom = new DOMDocument; 
libxml_use_internal_errors(true); 
$dom->loadHTML($html); 


$tags = $dom->getElementsByTagName('img'); 
$length = $tags->length; 

for ($i=$length-1; $i>=0; $i--) { 
    $tag = $tags->item($i); 
    $title = $tag->getAttribute('title'); 

    // check if title is of the format '##...##' 
    if (preg_match('/##\w+?##/', $title)) { 
     $textNode = $dom->createTextNode($title); 
     $tag->parentNode->replaceChild($textNode, $tag); 
    } 
} 

$html = preg_replace(
    '~<(?:!DOCTYPE|/?(?:html|head|body))[^>]*>\s*~i', '', 
    $dom->saveHTML() 
); 
echo $html; 

출력 :

<p>your name : 
##name##</p> 
<p>your lastname: 
##lastname##</p> 
<p>your email : 
##email##</p> 
<p>submit 
<img title="submit" src="submit.jpg"></p> 

Demo

+0

감사합니다. 왜 ## lastname ##이 (가) 바꾸지 않고 작동하지 않습니다!? –

+0

@ArazJafaripur : 업데이트 된 답변을 참조하십시오. –

+0

좋은데,하지만이 형식은 ## 좋은 생각입니다./## ([^ #] *) ##/ –

0

그래서 먼저 그 어떤 영역을 선택합니다.

이렇게 작성하면 정규식을 만들 수 있기를 바랍니다.

1

$content = preg_replace('/<img.*?(##.+##).*?\/>/', '$1', $content); 
1

난 당신이에 시도를 줄 수 있다고 생각하십시오 여기에 내장 된 DOMDocument 클래스를 사용하는 솔루션입니다 :

$content = preg_replace('/<img.*?(##.+##).*?\/>/','${1}', $content); 
$content = str_replace('##','',$content); 
관련 문제