【问题标题】:Getting innertext of HTML tags using Regular Expressions使用正则表达式获取 HTML 标记的内部文本
【发布时间】:2008-12-18 02:28:28
【问题描述】:

我无法捕获这些数据:

              <tr>
                <td><span class="bodytext"><b>Contact:</b><b></b></span><span style='font-size:10.0pt;font-family:Verdana;
  mso-bidi-font-family:Arial'><b> </b> 
                      <span class="bodytext">John Doe</span> 
                     </span></td>
              </tr>
              <tr>
                <td><span class="bodytext">PO Box 2112</span></td>
              </tr>
              <tr>
                <td><span class="bodytext"></span></td>
              </tr>

              <!--*********************************************************


              -->
              <tr>
                <td><span class="bodytext"></span></td>
              </tr>



              <tr>
                <td><span class="bodytext">JOHAN</span> NSW 9700</td>
              </tr>
              <tr>
                <td><strong>Phone:</strong> 
                02 9999 9999
                    </td>
              </tr>

基本上,我想获取“联系人:”之后和“电话:”之前的所有内容,减去 HTML;但是这两个名称可能并不总是存在,所以我需要真正抓住两个冒号 (:) 之间的所有内容,这些内容不在 HTML 标记内。 &lt;span class="bodytext"&gt;***data***&lt;/span&gt; 的数量实际上可能会有所不同,所以我需要某种循环来匹配这些。

我更喜欢使用正则表达式,因为我可以可能使用循环和字符串匹配来做到这一点。

另外,我想知道 PHP 正则表达式中不匹配组的语法。

任何帮助将不胜感激!

【问题讨论】:

    标签: php regex


    【解决方案1】:

    如果我理解正确,您只对 HTML 标记之间的文本感兴趣。要忽略 HTML 标签,只需先剥离它们:

    $text = preg_replace('/<[^<>]+>/', '', $html);
    

    要获取“联系人:”和“电话:”之间的所有内容,请使用:

    if (preg_match('/Contact:(.*?)Phone:/s', $text, $regs)) {
      $result = $regs[1];
    } else {
      $result = "";
    }
    

    要获取两个冒号之间的所有内容,请使用:

    if (preg_match('/:([^:]*):/', $text, $regs)) {
      $result = $regs[1];
    } else {
      $result = "";
    }
    

    【讨论】:

      【解决方案2】:

      对这类问题的看似任意的堆栈溢出响应似乎是“天哪,不要使用正则表达式!改用Beautiful Soup!!”。就我个人而言,我更喜欢不必为此类小任务使用外部库,而正则表达式是一个不错的选择。

      去除所有 HTML 标记的一种简单方法是使用此正则表达式,这是解决此问题的一种方法:

      $text = preg_replace("/<.*?>/", "", $text);
      

      然后您可以使用任何您喜欢的方法来获取适当的文本内容。

      不匹配的组是这样的:(?:this won't match)

      【讨论】:

      • 那是什么? RegexBuddy 给了我 (?:this won't match) as PERL regex 但是没有 PHP 选项不能确定...
      • PHP 的 preg 函数使用 PCRE 风格,这是 RegexBuddy 中的一个选项。 nickf 的回答错过了 : 在他编辑之前。
      • 我相信你(和 OP)的意思是“非捕获组”,而不是“非匹配组”。非匹配组将是这样的:“(X(?
      【解决方案3】:

      听起来像screenscraping,或者您也可以在找到所需信息后使用strip_tags()

      【讨论】:

        猜你喜欢
        • 2018-06-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多