2014-02-13 275 views
0

我有一個HTML字符串,其內容如下:替換img標籤的標題屬性

<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> 

什麼是做到這一點的最好方法是什麼?

回答

1

使用HTML解析器來完成此任務。下面是使用內置的DOMDocument類的解決方案:

$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

不錯,但我認爲在檢查格式##這個regix是好工作。/##([^#] *)##/ –

0

所以首先要選擇的任何區域: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

試試這個

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

我覺得你可以試用一下這個:

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