从 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 目标的跨度。
这是示例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 目标的跨度。