2014-02-13 188 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);