首页 > 解决方案 > preg_replace 所有跨度及其内容无效

问题描述

此代码中的 preg_replcae 来自该站点上的另一个答案,并且应该用任何内容替换所有跨度及其内容,即删除所有跨度及其内容。但是,为什么它不起作用?

$string = <<<STR
<span>Span 1</span>
<div>DIV 1</div><div class="text">DIV 2</div>
<span> Span 2 </span>
<div class="apache">DIV 3</div>
<span>
Span 3
</span>
<span>
    Span 4
        </span>

STR;

$string = preg_replace("/<span[^>]+\>/is","",$string);

echo $string;

我希望得到的最终结果是:

<div>DIV 1</div><div class="text">DIV 2</div>
<div class="apache">DIV 3</div>
// no spans and their content
// everything else remains

标签: phppreg-replace

解决方案


[^>]+匹配一个或多个字符,所以<span>不会匹配。改用*那里。然后,因为您要匹配两者之间的所有内容,所以让我们匹配所有内容 ( .*?),然后是</span>结束标记。/<span[^>]*>.*?<\/span>/is成为我们最终的正则表达式。

<?php

$string = <<<STR
<span>Span 1</span>
<div>DIV 1</div><div class="text">DIV 2</div>
<span> Span 2 </span>
<div class="apache">DIV 3</div>
<span>
Span 3
</span>
<span>
    Span 4
        </span>

STR;

$string = preg_replace("/<span[^>]*>.*?<\/span>/is","",$string);

echo $string;

你可以在这里看到输出:https ://3v4l.org/X9C53


推荐阅读