从 HTML 中删除具有特定 class 的范围,但不使用正则表达式删除内容

Removing a span with a specific class from HTML , but not the content using regular expression

这是示例html

<div>
<span class="target"> Remove  parent span class only and save this text </span>      
</div>

这里我想要上面 html 如下仅使用正则表达式函数

<div>
Remove parent span class only and save this text
</div>

我试过这个:

$html = preg_replace('#<h3 class="target>(.*?)</h3>#', '', $html);

但是没用。

我不太明白,但是使用 jquery 你可以尝试类似的东西:

$('#target').parent().append($('#target').text());
$('#target').remove();

试试这个:

$html = preg_replace('#<(\w+) class="target">(.*)<\/>#', '', $html);

解释:

< 按字面意思匹配字符 <

第一个捕获组(\w+)

  • \w+ 匹配任何单词字符 [a-zA-Z0-9_] 这样,您可以捕获任何标签(h3、span 等)。

  • 量词:+一次到无限次之间,尽可能多次,按需回馈[贪婪]

    class="target"> 按字面匹配字符 class="target">(区分大小写)

第二个捕获组 (.*) 匹配任何字符

< 按字面意思匹配字符 <

\/ 按字面意思匹配字符 /

</code> 匹配与第一个捕获组最近匹配的相同文本</p> <p><code>> 按字面意思匹配字符 >

表示它将替换为第二个捕获组。

PS :将正则表达式与 HTML 一起使用会导致意外结果,使用时要小心(例如,在这种情况下,您可以通过添加另一个 class 或标签的属性)。

您正在匹配错误的标签,h3 而不是 span 还要检查 preg_replace 的签名,第二个参数是替换,在你的情况下它是空字符串。

$html = preg_replace('/<(span)[^\>]+>(.*?)<\/>/i', '', $html);

编辑: 刚刚注意到 op 只想删除具有特定 class

的跨度
$html = preg_replace('/<(span).*?class="\s*(?:.*\s)?target(?:\s[^"]+)?\s*"[^\>]*>(.*)<\/>/i', '', $html);

这应该涵盖具有任意数量属性和 classes 的跨度,并替换那些具有 class 目标的跨度。