Regex PHP:从另一个网站的代码块中获取特定内容

时间:2015-06-26 11:18:44

标签: php regex

我有一个网站,我想从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一样添加不需要的数据:(

2 个答案:

答案 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";