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

时间:2008-12-18 02:28:29

标签: 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> </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标签内的两个冒号(:)之间的所有内容。 <span class="bodytext">***data***</span>的数量实际上可能会有所不同,所以我需要某种循环来匹配这些。

我更喜欢使用正则表达式,因为我可能可能使用循环和字符串匹配来执行此操作。

另外,我想知道PHP regex中非匹配组的语法。

非常感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

如果我理解正确,您只对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 = "";
}

答案 1 :(得分:0)

看似随意的堆栈溢出响应这些问题似乎是“omg不使用正则表达式!使用Beautiful Soup代替!!”。就个人而言,我更喜欢不必使用外部库来完成这样的小任务,并且正则表达式是一个很好的替代方案。

剥离所有HTML标记的一种简单方法是使用此正则表达式来解决此问题:

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

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

非匹配组如下:(?:this won't match)

答案 2 :(得分:0)

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