关闭并打开<p>标签</p>

时间:2015-02-20 11:48:15

标签: php domdocument

我有一个在<img>中包含<div>个标签的功能。通常这些可以出现在<p>标签中(由于一个所见即所得的编辑器)。

    $doc->loadHtml($str);

    $tags = $doc->getElementsByTagName('img');

    foreach ($tags as $tag) {

        $div = $doc->createElement('div');
        $tag->parentNode->insertBefore($div, $tag);
        $div->appendChild($tag);
    }

我想更改我的功能,以便如果有一个打开的<p>标记,它会在开始</p>之前附加一个结束<div>标记,然后添加一个开头{{1在结束<p>之后。

目前输入时

</div>

我的输出是

'<p>blah blah <img src="incorrect.gif"> blah blah</p>

我希望输出

'<p>blah blah <div><img src="incorrect.gif"></div> blah blah</p>

2 个答案:

答案 0 :(得分:0)

我想到了两种方法:

  1. 而不是使用<div>...</div>包装图片,而是用</p><div>...</div><p>
  2. 打包
  3. 检测div标签并用</p>...<p>
  4. 换行

    如果您确定在图像周围使用的包装总是 <div>...</div>对,您可以考虑使用正则表达式进行简单替换:

    <强> PHP

    $html = preg_replace_all('/<div[^>]*>(.*?)</div>/i', '</p>$1<p>', $html)

    如果在包装div元素中包含属性,这也将起作用。但是,如果您打算开始使用正则表达式对HTML进行更复杂的操作,请参阅以前的帖子,详细说明为什么这是一个坏主意:

      

    Using regular expressions to parse HTML: why not?

答案 1 :(得分:0)

您可以使用 preg_replace 功能来实现此目的。

$html ='<p>blah blah <div><img src="incorrect.gif"></div> blah blah</p>';
echo preg_replace("/<p>(.*?)<div>(.*?)<\/div>(.*?)<\/p>/", "<p>$1</p><div>$2</div><p>$3</p>", $html);

我已经测试了几个案例,但是使用其他人进行了检查