【发布时间】:2015-06-18 00:00:33
【问题描述】:
我需要一个删除 span 标签的正则表达式,例如,如果我们有:
<span class="something"><strong>Hello</strong></span>
输出应该是:
<strong>Hello</strong>
【问题讨论】:
-
你试过了吗?
-
利用 DOM 来做到这一点,eval.in/312496
我需要一个删除 span 标签的正则表达式,例如,如果我们有:
<span class="something"><strong>Hello</strong></span>
输出应该是:
<strong>Hello</strong>
【问题讨论】:
在php 中,如果您想从字符串中删除某些内容,请尽可能使用内置函数,例如
strip_tags() 用于从字符串中删除所有 html 标签,htmlentities() 将所有适用的字符转换为 HTML 实体,例如 Hello 到 <b>Hello</b>,它按字面意思打印 html 文本(我在下面的示例中使用过)。但如果你想要一些不同于这里的基本操作的东西(仅从 html 文本中删除span 标签),那么你必须使用preg_replace。
下面是我使用preg_replace()的解决方案
$string_without_span_tag = preg_replace('/<span[^>]+\>|<\/span>/i', '', $string_with_span_tag);
echo htmlentities($string_without_span_tag);
//$string_with_span_tag = '<span class="something"><strong><span style="color:red;">Hello</span></strong></span>';
//output after using above regex: <strong>Hello</strong>
@Zdimitriv 的答案也有效,所以你也可以使用它,但如果你使用@mcklayin 的答案,那么要小心,我没有在 laravel 中测试过,但在核心 php 中,答案会给你错误:
Warning: preg_replace(): Unknown modifier 'p' in your_file_name.php on line XXX
其背后的原因是该答案中使用的模式/<span[^>]+?[^>]+>|</span>/i 但正则表达式将其理解为/<span[^>]+?[^>]+>|</s 因为在正则表达式中/ 是开始和结束分隔符,它显示错误p is unknown modifier 因为s 是single line modifier 在正则表达式中,因此它在 p 处停止并给出上述错误,要解决它,您必须使用 \ 转义 / 然后它也可以工作。
所以你可以使用下面的 3 种模式来删除 <span> 标签:
preg_replace('/<span[^>]+\>|<\/span>/i', '', $string_with_span_tag) //1. my answer
preg_replace('#</?span[^>]*>#is', '', $string_with_span_tag) //2.@Zdimitriv's answer
preg_replace('/<span[^>]+?[^>]+>|<\/span>/i', '', $string_with_span_tag) //3.@mcklayin's answer with edit
【讨论】:
我已经解决了这个问题
$tag = 'span';
$result = preg_replace('#</?'.$tag.'[^>]*>#is', '', $string);
【讨论】:
preg_replace('/<span[^>]+?[^>]+>|</span>/i','',$string)
【讨论】: