【问题标题】:Regex Tags Ignore all td tags inside of tr tag正则表达式标签忽略 tr 标签内的所有 td 标签
【发布时间】:2014-10-22 21:19:23
【问题描述】:

有没有办法解决这个问题?

我想要一个忽略 tr 标签中所有 td 标签的正则表达式。 我正在寻找的 tr 标签不正确,因为结束标签缺少 “/”。到目前为止,我有:

<tr[^>]*><td(?:(?!</td>).)*</td><tr[^>]*>

<tr[^>]*> This needs to be the beginning of the expression ****

<td(?:(?!</td>).)*</td> This will find everything between <td> and </td>

<tr[^>]*> This needs to be the end of the expression ****

这个正则表达式当然不起作用。以下是运行正则表达式的文本示例:

样本 1:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>                  
   </title>
</head>                             
<body>
   <table asdf>
      <tr asdf>
         <td asdf>
            <table asdf>
                <tr asdf: asdf>
                   <td>
                       blah blah blah
                   </td>
               </tr>
            </table>
          </td>
          <td>
              Keep going
          </td>
      <tr> If highlighted to here from first tr tag than correct regex was used
  </table>
</body>
</html>

示例 2:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>                  
   </title>
</head>                             
<body>
   <table asdf>
      <tr asdf>
         <td asdf>
            <table asdf>
                <tr asdf: asdf>
                   <td>
                       blah blah blah
                   </td>
               </tr>
            </table>
          </td>
          <td>
              <table asdf>
                <tr asdf: asdf>
                   <td>
                       blah blah blah
                   </td>
               </tr>
            </table>
          </td>
      <tr> If highlighted to here from first tr tag than correct regex was used
  </table>
</body>
</html>

示例 3:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>                  
   </title>
</head>                             
<body>
   <table asdf>
      <tr asdf>
         <td asdf>
            <table asdf>
                <tr asdf: asdf>
                   <td>
                       blah blah blah
                   </td>
               </tr>
            </table>
          </td>
          <td>
              <table>
                <tr>
                   <td>
                       blah blah blah
                   </td>
               </tr>
            </table>
          </td>
      <tr> If highlighted to here from first tr tag than correct regex was used
  </table>
</body>
</html>

示例 4:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <title>                  
   </title>
</head>                             
<body>

<table>
    <tr>
        <td>&nbsp;</td>
    </tr>
</table>
<br/>
<br/>
<br/>
<table class="afdadsf">
    <td></td>
</table>
<br/>
<br/>
<table class="fdafdas">
    <tr><td></td>
            </tr>
    </table>
</body>
</html>

我想要的输出是当执行正则表达式时,使用上面的两个示例文本突出显示第一个 tr 标记直到最后一个 tr 标记。假设 td 标签可能包含任何值的其他示例文本。

【问题讨论】:

  • 您想忽略&lt;tr&gt; 中的所有&lt;td&gt; 标签,但是缺少&lt;/tr&gt; 不是问题吗?您可能应该包括您想要的输出。
  • 我不认为缺少 是问题所在。我需要在正则表达式的结尾和开头有 ]*>,因为我正在寻找不正确地以 结尾的 标记。示例文本的代码部分解释了我想要的输出。我将编辑我的评论并将其移到代码部分之外。

标签: html regex tags


【解决方案1】:

根据发布和请求的内容,如果您的正则表达式引擎支持递归(?R),请使用此模式:

<tr[^>]*>.*(<(\S+)[^>]*>([^<]|(?1))*?<\/\2>).*?<tr[^>]*>  

可能需要一些广泛的测试
Demo


基于下面的评论&lt;tr&gt;标签总是最外层,使用这个模式s选项启用:

(<tr[^>]*>.*<tr>)

Demo

【讨论】:

  • 跳过是什么意思,你会更新你的问题并发布预期的输出。在这个更新的示例中,匹配 #1 是您要求突出显示的 regex101.com/r/yW4aZ3/95
  • 我编辑了我的问题,以下是我对您的回答的担忧: 1. 我在所有文件中都使用了这个正则表达式,如果该表达式不存在,那么它会突出显示文件中的所有内容。我有数千个文件要查看。 2.您的正则表达式仅适用于该示例文本。
  • 问题,有没有可能在最后一个“错误”&lt;tr&gt; 之后你会有更多的&lt;tr&gt;..&lt;/tr&gt; 标签?换句话说,不正确的标签总是最外层的吗?
  • @developer234,根据上次评论更新了我上面的答案。
  • 正则表达式适用于示例 3,这表明您的正则表达式适用于外部标签之间的所有内容,这很棒。根据示例 4,我仍然发现正则表达式存在一个小问题。示例 4 不应突出显示
猜你喜欢
  • 2015-04-12
  • 1970-01-01
  • 1970-01-01
  • 2016-08-15
  • 1970-01-01
  • 1970-01-01
  • 2015-10-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多