HTML中如何利用正则表达式去除tr td标签

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTML中如何利用正则表达式去除tr td标签相关的知识,希望对你有一定的参考价值。

我要把Table里面的数据导出到Excel文件中 但是导出来的数据里面不只有数据库的数据 tr td 标签也一并导出来了 如何解决

1.php替换
//原内容
$content = "<tanle><tr><td>这是第一个td内容</td><td>这是第二个td内容</td></tr></table>";
//匹配模式
$preg = '/<.*?>/is';
//所有的html标签都将被替换成空字符串
$content = preg_replace($preg,'',$content);
//在页面输出
echo $content;
结果:
这是第一个td内容这是第二个td内容


2. javascript替换html标签和空白字符
<html>
<head>
<title></title>
<script type="text/javascript">
window.onload = function ()
//获取body文档的内容包括了html标签
var content = document.body.innerHTML;
//匹配模式|查找所有html标签和空白字符
var reg = /<.+?>|\\s+/ig;
//替换符合替换模式的内容为空字符串,相当于删除
content = content.replace(reg,'');
//弹出结果
alert(content);


</script>
</head>
<body>
<table>
<tr>
<td>这是第一个td内容</td>
<td>这是第二个td内容</td>
<td>这是第三个td内容</td>
</tr>
</table>
</body>
</html>

参考技术A 在浏览器中直接选中复制,然后粘贴进excel可以么?

用于解析 HTML 表格的正则表达式?

【中文标题】用于解析 HTML 表格的正则表达式?【英文标题】:Regex for parsing HTML tables? 【发布时间】:2020-03-14 06:22:55 【问题描述】:

我已经尝试了很多不同的正则表达式,但找不到解决方案。

我需要一个正则表达式来查找:

<tr>
    <td>XYZ</td>
    <td>XYZ</td>
</tr>
<tr>
    <td>XYZ</td>
</tr>
<tr>
    <td>XYZ</td>
</tr>

这是我目前所拥有的:

<tr>\s*<td.*?>(.*?)</td>\s*<td.*?>(.*?)</td>\s*</tr>(\s*<tr>\s*<td>.*?</td>\s*</tr>)*

所以第一个&lt;tr&gt; 块必须包含两个&lt;td&gt; 标记,所有后续(0 个或多个)&lt;tr&gt; 标记必须只包含1 个&lt;td&gt; 标记。

非常感谢。

【问题讨论】:

不要使用正则表达式来解析 HTML。使用 HTML 解析器。 @Andreas 是的,我知道,但这是大学的任务,我们必须使用正则表达式。通常我用 HTML 解析器来做 :( 请告诉给你这些问题/答案的人:***.com/questions/1732348/…、Can you provide some examples of why it is hard to parse XML and HTML with a regex?、Using regular expressions to parse HTML: why not?。 但只是为了“好玩”,让我们来处理这个正则表达式。您面临哪些问题?到目前为止你有什么? @Pshemo 我的正则表达式到目前为止看起来像这样:&lt;tr&gt;(.*?&lt;td.*?&gt;(.*?)&lt;/td&gt;)2.*?&lt;/tr&gt;(.*?&lt;tr&gt;.*?&lt;td&gt;(.*?)&lt;/td&gt;.*?&lt;/tr&gt;)*? 【参考方案1】:

用正则表达式处理 HTML 标签是有问题的;如果可能的话,应该使用 HTML 解析。让我们举一个识别(虚构)标签&lt;a&gt;&lt;b&gt; 的简单案例。为了简单起见,我们假设我们不必担心这些标签或空白区域的属性。我们有兴趣识别嵌套在&lt;a&gt; 标记中的单个&lt;b&gt; 标记,例如:

<a><b>1</b></a>

“明显”但不正确的正则表达式是:

<a><b>.*?</b></a>

它会匹配上面的例子,但它也会匹配:

<a><b>1</b><b>2</b></a>

即使.*? 不是贪心,它也是贪婪的,它试图将输入的其余部分与正则表达式的其余部分进行匹配。

您需要将 .*? 替换为不会扫描结束 &lt;/b&gt; 标记的内容:

((?!</b>).)*

这表示只要下一个字符不是结束 &lt;/b&gt; 标记,就再扫描一个字符。为了更好地衡量,您可能还需要确保不要跳过另一个 &lt;a&gt; 标记的开头:

((?!(<a>|</b>)).)*

所以最终的正则表达式变为:

<a><b>((?!(<a>|</b>)).)*</b></a>

无论如何,这就是我所采取的方法。因此,当前问题的正则表达式变得相当复杂。

我的理解是,您正在寻找一个带有两个嵌套 &lt;td&gt; 标记的 &lt;tr&gt; 标记,然后是 0 个或多个 &lt;tr&gt; 标记和一个嵌套 &lt;td&gt; 标记。如果我直截了当,那么正则表达式是:

"(?s)<tr[^>]*>(\\s*<td[^>]*>((?!(<tr|</td)).)*</td>\\s*)2\\s*</tr>(\\s*<tr[^>]*>\\s*<td[^>]*>((?!(<tr|</td)).)*</td>\\s*</tr>)*"

代码:

import java.util.regex.Pattern;
import java.util.regex.Matcher;
import java.util.regex.MatchResult;

public class Test

    public static void doMatch (String s) 
        Pattern pattern = Pattern.compile("(?s)<tr[^>]*>(\\s*<td[^>]*>((?!(<tr|</td)).)*</td>\\s*)2\\s*</tr>(\\s*<tr[^>]*>\\s*<td[^>]*>((?!(<tr|</td)).)*</td>\\s*</tr>)*");
        Matcher matcher = pattern.matcher(s);
        while (matcher.find()) 
            MatchResult m = matcher.toMatchResult();
            System.out.println("Match: " + m.group(0));
        
    

    public static void main(String[] args) 
        String s = "<tr>\n    <td>XYZ</td>\n    <td><tag1>abc\ndef</tag2></td>\n</tr>\n<tr>\n    <td>XYZ</td>\n</tr>\n<tr>\n    <td>XYZ</td>\n</tr>";
        Test.doMatch(s);
        s = "<tr><td>1></td><td>2</td></tr><tr><td>3></td><td>4</td></tr><tr><td>5></td><td>6</td></tr><tr><td>7</td></tr>";
        Test.doMatch(s);
    

打印:

Match: <tr>
    <td>XYZ</td>
    <td><tag1>abc
def</tag2></td>
</tr>
<tr>
    <td>XYZ</td>
</tr>
<tr>
    <td>XYZ</td>
</tr>
Match: <tr><td>1></td><td>2</td></tr>
Match: <tr><td>3></td><td>4</td></tr>
Match: <tr><td>5></td><td>6</td></tr><tr><td>7</td></tr>

【讨论】:

【参考方案2】:

这是从网页源代码中提取 HTML 表格的正则表达式格式:

(?is)<tr.*?>.*?(?:<td.*?>(.*?)<\/td>\s*)(?=(?:<td.*?>(.*?)<\/td>)?).*?<\/tr>

您可以在任何编程语言中应用上述格式。这取决于所使用的语言如何处理正则表达式。

【讨论】:

&lt;code&gt;? --- 你为什么要逃避/? Java 正则表达式不需要那个。 --- (?: ) 非捕获组的目的是什么? 这不能按预期工作。我不是专家,但我需要“计算”TD-Tag 的出现次数。如何实现?

以上是关于HTML中如何利用正则表达式去除tr td标签的主要内容,如果未能解决你的问题,请参考以下文章

java 利用jsoup 如何去除一段代码中的所有html标签,只留纯文本

C#正则表达式解析HTML [重复]

正则表达式去除 HTML 标签

js用正则把换行br替换为段落p

向各位正则高手请教:java 如何用正则 ,去除html标签之间的空格

如何利用oracle正则表达式去除字段中含有的汉字