我正在尝试解析HTML页面并获取特定数据(使用PHP)。 这是我的正则表达式:
$pattern = '/class=\"group\">.*[\n\r]*.*[\n\r]*.*[\n\r]*.*/';
preg_match_all($pattern, $subject, $matches);
这就是我找到的(以黄色突出显示):
<NOBR>םושיר לטב<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号)。
答案 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";
}
没有换行符/行号陷阱。
答案 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
是任何类型空格的快捷方式(换行符,制表符,空格......)