获得正则表达式的一部分

时间:2014-02-17 09:00:05

标签: php html regex parsing

我正在尝试解析HTML页面并获取特定数据(使用PHP)。 这是我的正则表达式:

$pattern = '/class=\"group\">.*[\n\r]*.*[\n\r]*.*[\n\r]*.*/';
preg_match_all($pattern, $subject, $matches);

这就是我找到的(以黄色突出显示):

enter image description here

<NOBR>םושיר&nbsp;לטב<input type="checkbox" name="DEL104004"
onClick="UPG104004.selectedIndex=0"></NOBR></TD>
<TD class="group">22</TD>
<TD class="points">5.0</TD>
<TD>some text</TD>
<TD><A HREF="http://www.website.com/mk.php?MK=104004" class="mk">104004</A></TD>
</TR>
<TR ALIGN=RIGHT BGCOLOR=#FFCC33>
<TD COLSPAN=2><BR></TD>
<TD>5.0</TD>

但实际上我只需要用红色圈出的数据(22,104004)。我可以使用正则表达式吗?

更多信息

我可以假设这个特殊的结构不会改变。 HTML主要是一个包含很少行的表,其中一些包含我想要获取的数据(组号和MK号)。

2 个答案:

答案 0 :(得分:4)

根据您更新的信息( ...我想要的数据(组号和MK号)),您可以使用XPath完成:

$dom=new DOMDocument("1.0","UTF-8");
$dom->loadHTML($html);
$xpath=new DOMXPath($dom);
foreach($xpath->query('//td[@class="group" or @class="mk"]') as $node)
{
    echo $node->attributes->getNamedItem("class")->nodeValue; /* class name */
    echo ": ";
    echo $node->textContent; /* data */
    echo "\n";
}

Online demo

没有换行符/行号陷阱。

答案 1 :(得分:3)

如果你的HTML是常量,总是这种模式,你可以使用一个容易破解的正则表达式:

$pattern = '/(?:class="group"[^>]*>|class="mk"[^>]*>)\s*(\d+)/'
preg_match_all($pattern, $subject, $matches);

这将捕获捕获组中所需类标记之后的所有数字(即$matches[1])。显然,这只是一个快速的&amp;脏的解决方案,因为HTML中的一些修改会破坏它:但是因为你说这是非常有限的用途......(如果它易于改变你应该真的考虑HTML解析器解决方案)

一些解释

  • (\d+)\d[0-9]的快捷方式,括号是捕获组。捕获组允许您在变量中存储它匹配的内容,以便可以在同一个正则表达式中重用它,或者可以在以后提取它。此处,第一个捕获组结果将存储在$matches[1]
  • (?:...):此结构是非捕获组。它允许您使用括号对模式进行分组,而不捕获它们。这使您只能存储您想要的内容。
  • |:管道意味着
  • [^...]表示但是方括号内的内容(^是这些括号内的特殊字符)
  • \s是任何类型空格的快捷方式(换行符,制表符,空格......)