regexp在提取HTML时有效,但与file_get_contents无关

时间:2014-01-15 15:47:25

标签: php regex html-parsing

这是我的代码

$file_string = file_get_contents('http://wiki.teamliquid.net/starcraft2/ASUS_ROG_NorthCon_2013');

preg_match_all('/<th.*>.*Organizer.*<a.*>(.*)<\/a>/msi', $file_string, $organizer);
if (empty($organizer[1])) {
    echo "Couldn't get organizer \n";
    $stats['organizer'] = 'ERROR';
}
else {
    $stats['organizer'] = $organizer[1];
}

我正试图从http://wiki.teamliquid.net/starcraft2/ASUS_ROG_NorthCon_2013右侧的“联赛信息”框中获取“管理器”字段,但它无效。

然而(这是我不明白的),当我从页面复制HTML并将$ file_string变量更改为:

$file_string = '<tr>
<th valign="top"> Organizer:
</th>
<td style="width:55%;"> <a rel="nofollow" target="_blank" class="external text" href="http://www.northcon.de/">NorthCon</a>
</td></tr>';

正则表达式有效。也许它可能是JavaScript或其他东西?但是,我可以使用regexp提取同一个框中几乎所有其他行的数据。我发誓我错过了一些明显的东西,也许我只需要一双新鲜的眼睛?

1 个答案:

答案 0 :(得分:2)

此代码应该有效:

$file_string = file_get_contents('http://wiki.teamliquid.net/starcraft2/ASUS_ROG_NorthCon_2013');

preg_match_all('/<th.{0,30}>.*Organizer.*?<\/a>/msi', $file_string, $organizer);
print_r($organizer);
if (empty($organizer[0])) {
    echo "Couldn't get organizer \n";
    $stats['organizer'] = 'ERROR';
}
else {
    $stats['organizer'] = $organizer[0];
}

而不是$ organizer [1]放置$ organizer [0]因为这将是你的第一个(也是唯一的)结果。 你必须通过在它后面加上问号来制作。*懒惰。这意味着一旦找到它想要的东西,它就会停止搜索。

例如此代码

<a.*>(.*)<\/a>

将从第一个标记搜索到页面上的最后一个标记(当它找到&lt; / a&gt;时它不会停止) 而这段代码

<a.*?>(.*?)<\/a>

会在找到第一个&lt; / a&gt;

后停止搜索

回复后检查源代码。 这将是结果(我假设您希望它包含html):

<th valign="top"> Organizer:
</th>
<td style="width:55%;"> <a rel="nofollow" target="_blank" class="external text" href="http://www.northcon.de/">NorthCon</a>