将img标记替换为title属性

时间:2014-02-13 12:46:55

标签: php regex

我有一个包含以下内容的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>

最好的方法是什么?

4 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

试试这个

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

答案 2 :(得分:1)

我想你可以尝试一下这个:

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

答案 3 :(得分: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 "##"

的部分

通过这样写出来,我希望你能想出这样做的正则表达式。