我有一个网站,我想从7个帖子中获取具体内容。所有7个帖子都有相同的HTML布局(见下文)
<div class="eventInfo">
<h3>Z's(矢沢永吉)</h3>
<h4>Z's TOUR 2015</h4>
<dl>
<dt><img src="/event/img/btn_day.png" alt="公演日時" width="92" height="20"> </dt>
<dd>
<table width="99%" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td width="9%" nowrap="nowrap">2015年6月</td>
<td width="74%">4日 (木) 19:00開演</td>
</tr>
</tbody></table>
</dd>
<dt><img src="/event/img/btn_price.png" alt="料金" width="92" height="20"> </dt>
<dd>S¥10,500 A¥7,500 (全席指定・消費税込)<br><span class="attention">※</span>注意事項の詳細を<a href="http://www.siteurl.com/info/live/guidelines.html" target="_blank">矢沢永吉公式サイト</a>より必ずご確認ください</dd>
<dt><img src="/event/img/btn_ticket.png" alt="一般発売" width="92" height="20"> </dt>
<dd>
<table width="99%" border="0" cellpadding="0" cellspacing="0">
<tbody><tr>
<td width="9%" nowrap="nowrap">2015年5月</td>
<td width="74%">16日(土)</td>
</tr>
</tbody></table>
</dd>
<dt><img src="/event/img/btn_contact.png" alt="お問合わせ" width="92" height="20"> </dt>
<dd><a href="http://www.siteurl.com/" target="_blank">ソーゴー大阪</a> 06-6344-3326</dd>
<dt><img src="/event/img/btn_info.png" alt="公演詳細" width="92" height="20"> </dt>
<dd><a href="http://www.siteurl.com/zs/index_pc.html" target="_blank">http://www.siteurl.com</a> </dd>
</dl>
</div>
我只想从这个布局和代码中的第一个表中获取H3。我应该使用什么正则表达式方法来获得所需的结果?
这些是7个帖子,就像上面的代码一样,我必须得到H3和每个帖子的第一个表格。
我已对其进行了测试,但不确定这是否正确:https://regex101.com/r/sO6tJ8/1
但是你可以看到我必须像H4 DT IMG一样添加不需要的数据:(
答案 0 :(得分:0)
我不认为正则表达式是你最好的选择。如果你可以在不使用正则表达式的情况下逃脱,我会这样做。看看Goutte PHP网络刮板。
$crawler = $client->request('GET', 'http://www.example.com/some-page');
$heading = $crawler->filter('h3')->first();
$table = $crawler->filter('table')-> first();
这不仅具有更好的可读性,还可以在html结构发生变化时更容易修复。
如果你必须选择正则表达式,你可以为h3执行类似下面的操作(没有测试它,但是类似的东西):
$html = preg_replace_callback(
'/<h3>(.*?)<\/h3>/u',
function ($match) {
return $match[1];
},
$html
);
对于表格而言,只有你必须使用多线修饰符m
(将它添加到h3也没有什么坏处,但是从你的例子中你不需要它)。
答案 1 :(得分:0)
// I'm assuming you can get the HTML into a variable somehow
// I did my testing w/ a local file with your HTML content
$data = file_get_contents('foo.html');
$h3_content = array();
$table_content = array();
// h3 content is easy to grab, but it could be on multiple lines!
// I didn't account for multiline here:
preg_match('/<h3>([^<]+)<\/h3>/', $data, $h3_content);
// regex can't find the ending table tag easily, unless the
// entire HTML on one line, so make everything one line
// you don't need a new variable here, I did it only to be explicit
// that we have munged the original HTML into something else
$data2 = str_replace("\n", '', $data);
// to separate tables, put new line after each one
$data2 = str_replace('</table>', "</table>\n", $data2);
// now regex is easy
preg_match_all('/(<table.+<\/table>)/m', $data2, $table_content);
echo $h3_content[1], "\n";
echo $table_content[0][1], "\n";