我有一个包含以下内容的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>
最好的方法是什么?
答案 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>
答案 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 "##"
。
通过这样写出来,我希望你能想出这样做的正则表达式。