如何使用PHP解析这种HTML代码?

时间:2013-01-04 19:18:50

标签: php html-parsing

首先,我在SO上找到了一些线程,例如here,但这并不是我想要的。

以下是我的文字示例:

Some text bla bla bla bla<br /><b>Date</b>: 2012-12-13<br /><br /><b>Name</b>: Peter Novak<br /><b>Hobby</b>: books,cinema,facebook

所需的输出:

2012-12-13
Peter Novak
books,cinema,facebook

我需要将这些信息保存到我们的数据库中,但我不知道,如何在<b>标签之间检测值(例如Date),然后立即检测值(在此案例: 2012-12-13)...

我很感激每一个帮助,谢谢!

4 个答案:

答案 0 :(得分:1)

由于没有多少DOM可以遍历,因此DOM遍历工具对此无能为力。

这应该有效:

1)删除b标记之前的所有内容。

2)删除b标签。 DOM遍历工具可以执行此操作,但如果它们是纯文本,即使正则表达式也可以执行此操作,并且它可以删除相同传递中的冒号和后续空格:<b\s*>[^<]+</b\s*>:\s*

3)将br标签的序列更改为裸线(您真的想要吗?)。 DOM遍历工具可以执行此操作,但正则表达式可以执行此操作:(?:<br\s*/?>)+

$html = preg_replace('#^[^<]+#', "", $html);
$html = preg_replace('#<b\s*>[^<]+</b\s*>:\s*#', "", $html);
$html = preg_replace('#(?:<br\s*/?>)+#', "\n", $html);

答案 1 :(得分:0)

如果<b>Date</b><b>Name</b><b>Hobby</b><br />以这种方式始终存在,我建议您使用strpos()和{{ 3}}

例如,要获取日期:

// Get start position, +13 because of "<b>Date</b>: "
$dateStartPos = strpos($yourText, "<b>Date</b>") + 13;
// Get end position, use dateStartPos as offset
$dateEndPos = strpos($yourText, "<br />", $dateStartPos);
// Cut out the date, the length is the end position minus the start position
$date = substr($yourText, $dateStartPos, ($dateEndPos - $dateStartPos));

答案 2 :(得分:0)

假设格式一致,那么explode可以为您服务:

<?php
$text = "Some text bla bla bla bla<br /><b>Date</b>: 2012-12-13<br /><br /><b>Name</b>: Peter Novak<br /><b>Hobby</b>: books,cinema,facebook";
$tokenized = explode(': ', $text);
$tokenized[1] = explode("<br", $tokenized[1]);
$tokenized[2] = explode("<br", $tokenized[2]);
$tokenized[3] = explode("<br", $tokenized[3]);

$date = $tokenized[1][0];
$name = $tokenized[2][0];
$hobby = $tokenized[3][0];

echo $date;
echo $name;
echo $hobby;

?>

答案 3 :(得分:0)

使用PHP Simple HTML DOM Parser可以轻松实现这一点(就像jQuery一样)

include('simple_html_dom.php');
$html = str_get_html('Some text bla bla bla bla<br /><b>Date</b>: 2012-12-13<br /><br /><b>Name</b>: Peter Novak<br /><b>Hobby</b>: books,cinema,facebook');

或者

$html = file_get_html('http://your_page.com/');

然后

foreach($html->find('text') as $t){
    if(substr($t, 0, 1)==':')
    {
        // do whatever you want
        echo substr($t, 1).'<br />';
    }
}

示例的输出在下面给出

2012-12-13
Peter Novak
books,cinema,facebook