繁体   English   中英

使用正则表达式获取匹配的HTML值

[英]Getting Matched HTML Value with Regex

好的,我知道我不应该使用Regex来解析HTML,因为它不是很可靠,也不是100%安全的,等等。但是,这只是其他方面对Regex的学习。

因此,我的示例使用bbc网站http://www.bbc.co.uk/sport/football/premier-league/table

该项目正在解析第一个表的正文。 我试图进行搜索,以便仅返回与搜索值匹配的元素。 例如,给定搜索“ manc”,我希望曼彻斯特城和曼彻斯特的tr标签统一(与URL匹配)。

到目前为止,我所拥有的是<tr\\b[^>]*>(.*?)manc(.*?)</tr>但这从第一个tr匹配到man city之后的关闭tr,然后返回预期的曼联的结果。 谁能指出我使用此正则表达式出错的地方。

编辑:源(修剪)

<tbody id="trc-20-118996114-3">
  <tr id="team-138824012" class="team first">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-up'>Moving up</span>
      <span class='position-number'>1</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/arsenal'>Arsenal</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973141">Report</a>
    </td>
  </tr>
  <tr id="team-137316633" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-up'>Moving up</span>
      <span class='position-number'>2</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/aston-villa'>Aston Villa</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="loss last" title="Loss">
          <span>Loss</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973120">Report</a>
    </td>
  </tr>
  <tr id="team-137318151" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-down'>Moving down</span>
      <span class='position-number'>7</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/manchester-city'>Man City</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973148">Report</a>
    </td>
  </tr>
  <tr id="team-137318152" class="team">
    <td class="statistics"></td>
    <td class='position'>
      <span class='moving-down'>Moving down</span>
      <span class='position-number'>8</span>
    </td>
    <td class="team-name">
      <a href='http://www.bbc.co.uk/sport/football/teams/manchester-united'>Man Utd</a>
    </td>
    <td class="played">0</td>

    <td class="home-won">
      <span>0</span>
    </td>
    <td class="home-drawn">0</td>
    <td class="home-lost">0</td>
    <td class="home-for">0</td>
    <td class="home-against">0</td>
    <td class="away-won">
      <span>0</span>
    </td>
    <td class="away-drawn">0</td>
    <td class="away-lost">0</td>
    <td class="away-for">0</td>
    <td class="away-against">0</td>
    <td class="goal-difference">0</td>
    <td class="points">0</td>
    <td class="last-10-games">
      <ol>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="draw" title="Draw">
          <span>Draw</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="loss" title="Loss">
          <span>Loss</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win" title="Win">
          <span>Win</span>
        </li>
        <li class="win last" title="Win">
          <span>Win</span>
        </li>
      </ol>
    </td>
    <td class="status">
      <a class="report" href="http://www.bbc.co.uk/sport/0/football/17973162">Report</a>
    </td>
  </tr>
</tbody>

REGEX不适合这样做,因为它不是设计成解析器。 除非情况非常宽松,尤其是在JavaScript(具有相当原始的REGEX实现)中,否则无法希望确定哪个开始标记匹配哪个结束标记。

首先,我们需要使用[\\s\\S]而不是. 因为后者不能与多行一起使用,因为它与空格字符不匹配,并且您提到的表格的HTML在多行上。 前者会做到,因为它是一个可以匹配所有空间和非空间(即所有东西)的范围。

考虑到这一点,您可能会想这样做:

/<tr\b[^>]*?>[\s\S]*?manc[\s\S]*?<\/tr>/gi

...即获取所有提及字符串“ manc”的行。

使用以下简化的HTML:

<table>
    <tr>
        <td>Notts County</td>
    </tr>
    <tr>
        <td>Manchester United</td>
    </tr>
    <tr>
        <td>Arsenal</td>
    </tr>
</table>

...上述模式将匹配

<tr>
    <td>Notts County</td>
</tr>
<tr>
    <td>Manchester United</td>
</tr>

这是合乎逻辑的。 REGEX模式从头开始,找到开头的tr (Notts County),并询问是否在不确定数目的可选字符之后找到字符串“ Manc”。 它是。

当然,问题在于,自从我们的[\\s\\S]*?以来,在找到“ Manc”时,它不知不觉地在tr边界上游荡到了下一行[\\s\\S]*? 模式允许它。

我们不能避免这种情况,因为REGEX不允许您否定序列-只能否定范围内的字符(否定的前瞻性和后向断言除外)。

简而言之,一定要学习REGEX,但是您选择了一个困难的字符串开头:)

问题是,您的正则表达式太宽泛。 看看您要的是:

<tr\b[^>]*>(.*?)manc(.*?)</tr>

让我们简化一下。

<tr>.*?manc.*?</tr>

所以你是说,好的。 我需要先匹配tr,然后再匹配manc,然后再匹配anything ,再匹配tr。 所以。 当然会发生的是,正则表达式从第一个tr开始就可以了。 我有一个tr让我继续匹配,直到找到manc。 同时,您可能刚刚通过了一堆其他 tr。 但是您的正则表达式不在乎。

尝试这个:

<tr>(?:(?!</tr>).)*manc.+?</tr>

或者,我想在您的示例中:

<tr\b[^>]*>(?:(?!</tr>).)*manc.+?</tr>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM