Php 使用正则表达式获取HTML标记的内部文本

Php 使用正则表达式获取HTML标记的内部文本,php,regex,Php,Regex,捕获此数据时遇到问题: <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> &l

捕获此数据时遇到问题:

              <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>

联系人:
无名氏
邮政信箱2112
新南威尔士州约翰9700
电话:
02 9999 9999
基本上,我想抓取“联系人:”之后和“电话:”之前的所有内容,减去HTML;然而,这两个名称可能并不总是存在,所以我需要真正抓住两个冒号(:)之间的所有东西,它们不在HTML标记中。
***数据***
的数量实际上可能有所不同,因此我需要某种循环来匹配这些数据

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

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


任何帮助都将不胜感激

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

$text = preg_replace('/<[^<>]+>/', '', $html);
要获取两个冒号之间的所有内容,请使用:

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

对这类问题的看似任意的堆栈溢出响应似乎是“omg不要使用正则表达式!改用!!”。就我个人而言,我不喜欢在这样的小任务中使用外部库,正则表达式是一个很好的选择

去除所有HTML标记的一种简单方法是使用以下正则表达式:

$text = preg_replace("/<.*?>/", "", $text);
$text=preg\u replace(“//”,“,$text”);
然后,您可以使用任何您喜欢的方法来获取适当的文本内容


不匹配的组是这样的:
(?:这不匹配)

听起来像,或者在找到所需信息后也可以使用。

那是什么?RegexBuddy给我的(?:这不匹配)是PERL-regex,但没有PHP选项无法确定…PHP的preg函数使用PCRE风格,这是RegexBuddy中的一个选项。nickf的回答漏掉了:在他编辑之前。我相信你(和OP)的意思是“非捕获组”,而不是“非匹配组”。一个不匹配的组是这样的:“(X(?)?
$text = preg_replace("/<.*?>/", "", $text);