【问题标题】:Removing a span with a specific class from HTML , but not the content using regular expression从 HTML 中删除具有特定类的跨度,而不是使用正则表达式的内容
【发布时间】:2015-04-29 13:41:19
【问题描述】:

这里是示例 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);

但是没有用。

【问题讨论】:

  • 你试过了吗?
  • $html = preg_replace('#

    ^ 然后将add 加入您的问题并展示您的努力/工作!

  • 感谢您的快速回复,但没有成功

标签: php regex html-parsing


【解决方案1】:

试试这个:

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

解释:

&lt; 匹配字符 &lt; 字面意思

第一捕获组(\w+)

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

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

    class="target"&gt; 与字符 class="target"&gt; 字面匹配(区分大小写)

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

&lt; 匹配字符 &lt; 字面意思

\/ 匹配字符 / 字面意思

\1 匹配第一个捕获组最近匹配的相同文本

&gt; 匹配字符 &gt; 字面意思

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

PS:在 HTML 中使用正则表达式可能会导致意想不到的结果,使用时要小心(例如,在这种情况下,您可以通过向标签添加另一个类或属性来破坏正则表达式)。

【讨论】:

  • 为什么 OP 应该“试试这个”?请添加对您所做的事情以及您这样做的原因的解释,不仅是为了 OP,而且是为了未来的 SO 访问者。
  • 编辑:增加精度
  • 非常感谢,您让我的一天变得轻松。
  • 不客气。不要忘记将此问题标记为已解决;)
【解决方案2】:

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

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

编辑: 刚刚注意到 op 只想删除具有特定类的跨度

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

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

【讨论】:

    【解决方案3】:

    我不太明白,但是使用 jquery 你可以尝试这样的事情:

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

    【讨论】:

    • 但是 OP 想要一个正则表达式的解决方案。
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签