寻找在一些随机HTML片段中获取某些HTML文本内容的最佳方法
我似乎无法弄清楚它的正则表达式。
<td valign="top" style="border: solid 1px black; padding: 4px;">
<h4>Dec 05, 2015 23:16:52</h4>
<h3>rron7pam has won</h3>
</td>
<table width="100%" style="border: 1px solid #DED3B9" id="attack_info_att">
<tbody>
<tr>
<th style="width:20%">Attacker:</th>
<th><a title="..." href="/guest.php?screen=info_player&id=255995">Bliksem</a></th>
</tr>
</tbody>
</table>
以上仅为示例,但对于这些示例,我对
感兴趣我需要从单独的HTML代码中获得更多信息,但如果我能得到一两个权利,我可能会得到更多。
根据评论和答案进行编辑 HTML中可能有任意文本,具体取决于报告的设置方式(隐藏攻击者的单位等)我需要查找特定HTML标记的模式
在上面的示例中,“<h4></h4>
内部<h3></h3>
标记后面的<td>
标记之间的文字将是我需要的日期。
一些不同格式的链接示例:
https://enp2.tribalwars.net/public_report/70d3a2a55461e9eb09f543958b608304 https://enp2.tribalwars.net/public_report/5216e0e16c9d3657f981ce7e3cb02580
据我所知,有些元素总是相同的,例如,根据上述内容来获取日期。
答案 0 :(得分:3)
DOMDocument
的示例:
$url = 'https://enp2.tribalwars.net/public_report/70d3a2a55461e9eb09f543958b608304';
// prevent warnings to be displayed
libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->loadHTMLFile($url);
$xp = new DOMXPath($dom);
# lets find interesting nodes:
// td that contains all the needed informations (the nearest common ancestor in other words)
$rootNode = $xp->query('(//table[@class="vis"]/tr/td[./h4])[1]')->item(0);
// first h4 node that contains the date
$dateNode = $xp->query('(./h4)[1]', $rootNode)->item(0);
// following h3 node that contains the player name
$winnerNode = $xp->query('(./following-sibling::h3)[1]', $dateNode)->item(0);
$attackerNode = $xp->query('(./table[@id="attack_info_att"]/tr/th/a)[1]', $rootNode)->item(0);
# extract special values
$winner = preg_replace('~ has won$~', '', $winnerNode->nodeValue);
$attackerID = html_entity_decode($attackerNode->getAttribute('href'));
$attackerID = parse_url($attackerID, PHP_URL_QUERY);
parse_str($attackerID, $queryVars);
$attackerID = $queryVars['id'];
$result = [ 'date' => $dateNode->nodeValue,
'winner' => $winner,
'attacker' => $attackerNode->nodeValue,
'attackerID' => $attackerID ];
print_r($result);
答案 1 :(得分:0)
它不会很漂亮,但你可以使用strpos
来返回标签/内容的开始和结束位置。然后使用substr
返回字符串的那一部分。
string substr ( string $string , int $start [, int $length ] )
mixed strpos ( string $haystack , mixed $needle [, int $offset = 0 ] )
我会说,必须这样做可能意味着你接收数据的方式有些不对劲。我真的很想,一遍又一遍地扫描dom会很有效率。