【问题标题】:Closing and opening <p> tags关闭和打开 <p> 标签
【发布时间】:2015-02-20 11:48:14
【问题描述】:

我有一个将&lt;img&gt; 标签包装在&lt;div&gt; 中的函数。通常这些可以出现在&lt;p&gt; 标签中(由于所见即所得的编辑器)。

    $doc->loadHtml($str);

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

    foreach ($tags as $tag) {

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

我想改变我的功能,如果有一个打开的&lt;p&gt;标签,它会在打开&lt;div&gt;之前附加一个关闭&lt;/p&gt;标签,然后在关闭&lt;/div&gt;之后添加一个打开&lt;p&gt; .

当前输入时

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

我的输出是

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

我希望输出是

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

【问题讨论】:

  • $html ='

    blah blah

    blah blah'; echo preg_replace("/

    (.*?)

    (.*?)(.*?)/", "

    $1

    $2

    $3

    ", $html);
  • echo preg_replace("/

    (.*?)

    (.*?)(.*?)/", "

    $1

    $2

    $3

    ", $html);

标签: php domdocument


【解决方案1】:

我想到了两种方法:

  1. 不要用&lt;div&gt;...&lt;/div&gt; 包裹图像,而是用&lt;/p&gt;&lt;div&gt;...&lt;/div&gt;&lt;p&gt; 包裹它们
  2. 检测div标签并用&lt;/p&gt;...&lt;p&gt;包装它们

如果您确定您在图像周围使用的包装始终&lt;div&gt;...&lt;/div&gt; 对,您可以考虑使用正则表达式进行简单替换:

PHP

$html = preg_replace_all('/&lt;div[^&gt;]*&gt;(.*?)&lt;/div&gt;/i', '&lt;/p&gt;$1&lt;p&gt;', $html)

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

Using regular expressions to parse HTML: why not?

【讨论】:

    【解决方案2】:

    您可以使用 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);
    

    我已经测试了几个案例,尽管使用了几个其他的检查

    【讨论】:

      猜你喜欢
      相关资源
      最近更新 更多
      热门标签