删除<p>标记arround图像

时间:2017-02-11 10:31:54

标签: php regex preg-replace

我有一个字符串:

$str = '<p>line</p>
        <p><img src="images/01.jpg">line with image</p>
        <p><img src="images/02.jpg">line with image</p>';

并想把它变成:

$str = '<p>line</p>
        <img src="images/01.jpg"><p>line with image</p>
        <img src="images/02.jpg"><p>line with image</p>';

我试过

$result = preg_replace('%(.*?)<p>\s*(<img[^<]+?)\s*</p>(.*)%is', '$1$2$3', $str);

但它只删除一个图像而不是第二个图像。请建议正则表达式。

2 个答案:

答案 0 :(得分:1)

这将从img周围删除<p>标记(使用DOM解析器)

    $html = str_get_html('<p>line</p>
            <p><img src="images/01.jpg">line with image</p>
            <p><img src="images/02.jpg">line with image</p>');


    foreach($html->find('img') as $img) {    
  $str ="<p>".$img->parent()->plaintext."</p>";
  $img->parent()->outertext=$img;
  $img->parent()->outertext .=$str;

}
echo $html;

O / P:

<p>line</p>          
<img src="images/01.jpg">
  line with image          
<img src="images/02.jpg">
  line with image

答案 1 :(得分:0)

我发现了解决方案。这两个正则表达式一起解决了我的问题:

$str = '<p>line</p>
        <p><img src="images/01.jpg">line with image</p>
        <p>line with image<img src="images/02.jpg"></p>';
$str = preg_replace('/<p>(<img[^>]*>)/', '$1<p>', $str);
$str = preg_replace('/(<img[^>]*>)<\/p>/', '</p>$1', $str);
echo $str;

O / P:

<p>line</p>          
<img src="images/01.jpg"><p>line with image</p>          
<p>line with image</p><img src="images/02.jpg">

这是工作link和 非常感谢每个人,特别是@bobblebobble