PHP 简单的 HTML dom 解析器和preg_split,因为<html>缺少清晰的标签



我有一个网站,它使用来自各种不同网站来源的外部数据。这效果很好,但我正在努力解决一个特定的来源。问题是数据字符串不受明确的 html 标签<>约束,这意味着我需要以某种方式手动拆分数据。如果以前也用preg做过这件事,但对于下面的示例,我很难找到解决方案。

html 数据示例:

<div class="column8 gerechten">
<h1>Dagschotels</h1>    
<img src="http://emmaseetcafe.nl/wp-content/uploads/2014/09/voorgerecht2.jpg" class="attachment-fullwidth wp-post-image" alt="dagschotel" />        
<p>Elke week heeft Emma&#8217;s nieuwe dagschotels op het menu staan. Een dagschotel is te bestellen voor € 9,00-. Alle dagschotels zijn ook als kinderdagschotel te verkrijgen voor slechts €5,-. Reserveren voor een daghap is mogelijk, zolang de voorraad strekt.<br />
<br/></p>
<p><strong>28-02</strong>Pasta Tonno<br />
<strong>1-03</strong> Stampot andijvie met slavink<br />
<strong>2-03</strong> Gyros wrap met gebakken aardappelen<br />
</br><br />
<strong>7-03</strong> Erwtensoep met roggebrood<br />
<strong>8-03</strong> Köfte met friet en salade<br />
<strong>9-03</strong> Kipschnitzel met spinazie en gekookte aardappelen<br />
</br><br />
<strong>14-03</strong> Sjasliek met rijst<br />
<strong>15-03</strong> Kipsaté met nasi<br />
<strong>16-03</strong> Scholfilet met friet en gemengde groenten<br />
</br><br />
<strong>21-03</strong> Lente pasta ( verschillende lente groenten)<br />
<strong>22-03</strong> Taco&#8217;s met friet en salade<br />
<strong>23-03</strong> Kip kerrie met rijst<br />
</br><br />
<strong>28-03</strong> Schnitzel met friet en salade<br />
<strong>29-03</strong> Gehaktbal met friet en rode kool<br />
<strong>30-03</strong> Visstoofpotje met aardappelpuree</p>
<p><br/><br />
<strong>ZOLANG DE VOORAAD STREKT</strong><br />
RESERVEREN VAN DAGSCHOTELS IS MOGELIJK<br />
DAGSCHOTEL KOST € 9,00</p>

在后期处理之前,我需要的输出如下所示:

数组 = ["28-02 意大利面", "1-03 斯坦波特·安迪维遇见斯拉文克", "7-03 厄夫滕索普遇见罗格布罗德"] 等。

更新

我设法用简单的dom隔离了所有日期,因为所有日期都被<strong>标签包围。我使用了以下代码:

$html = file_get_html('http://emmaseetcafe.nl/menukaarten/dagschotels/', false, $this->getStreamContext());
// start to find the meals

// gets the main dish
foreach ($html->find('div[class=column8 gerechten]') as $container) {
foreach ($container->find('p') as $p) {
$temp[] = $p->innertext;
}
}
$temp = $temp[1];

$html = str_get_html($temp);
foreach ($html->find('strong') as $strong) {
$temp_dates[] = $strong->innertext;
}

结果是一个数组,所有日期都以 dd-mm 为单位。

所以现在剩下的就是将实际的膳食与以下文本字符串隔离开来:

'<strong>02-05</strong> Schnitzel met champignonsaus friet en salade<br /> <strong>03-05</strong> Mexicaanse wrap met friet<br /> <strong>04-05</strong> Pasta Tonno<br /> </br><br /> <strong>09-05</strong> Gegrilde paprika met couscous<br /> <strong>10-05</strong> Thaise Curry met rijst<br /> <strong>11-05</strong> Pasta AOP<br /> </br><br /> <strong>16-05</strong> Couscous met gegrilde kipfilet en geroosterde paprika<br /> <strong>17-05</strong> Tartaar met gebakken ui , frietjes en doperwten<br /> <strong>'... (length=955)

更新 2

我终于设法自己解决了它。我在最后一部分离开了最后的简单 dom,以删除强和破碎的<br />标签。

//var_dump($meal_string);
$meal_array = explode("<br />",$meal_string);

foreach ($meal_array as $meal){
$meals_no_tags[]= strip_tags($meal);   // strip all php / html tags         
}

// structure the data by removing emply items
foreach ($meals_no_tags as $meal_item){
if (strlen($meal_item)>3){
$meal_temp[] = $meal_item;
}
}

你最好使用HTML解析器而不是其他任何东西(如评论中指出的那样)。 这允许您使用文档结构来获取数据,而不是依赖内容。

以下代码使用 DOMDocument 及其加载 HTML 的能力。 尽管您提供的文档片段存在一些小问题,但可以忽略它们,因为它们不构成您感兴趣的结构的一部分(例如标签</br>)。

该代码使用 XPath 查找第二段中的<strong>标记作为标签,然后通过获取文档的下一个元素来获取文本。

$xml = new DOMDocument();
$xml->preserveWhiteSpace = false;
$content = file_get_contents("e.html");
libxml_use_internal_errors(true);
$xml->loadHTML('<?xml encoding="utf-8" ?>'.$content);
$xp = new DOMXPath($xml);
$labels = $xp->query("//div/p[2]//strong");
foreach ( $labels as $label )   {
$text = (string)$label->nextSibling->nodeValue;
echo (string)$label->nodeValue."=".$text.PHP_EOL;
}

哪些输出...

28-02=Pasta Tonno
1-03= Stampot andijvie met slavink
2-03= Gyros wrap met gebakken aardappelen
7-03= Erwtensoep met roggebrood
8-03= Köfte met friet en salade
9-03= Kipschnitzel met spinazie en gekookte aardappelen
14-03= Sjasliek met rijst
15-03= Kipsaté met nasi
16-03= Scholfilet met friet en gemengde groenten
21-03= Lente pasta ( verschillende lente groenten)
22-03= Taco’s met friet en salade
23-03= Kip kerrie met rijst
28-03= Schnitzel met friet en salade
29-03= Gehaktbal met friet en rode kool
30-03= Visstoofpotje met aardappelpureeLente pasta ( verschillende lente groenten)
22-03= Taco’s met friet en salade
23-03= Kip kerrie met rijst
28-03= Schnitzel met friet en salade
29-03= Gehaktbal met friet en rode kool
30-03= Visstoofpotje met aardappelpuree

由于上述 HTML 可能是较大文档的一部分,因此您可以更改 XPath 表达式以确保它获取正确的<div>元素。 您可以使用

//div[h1/text()="Dagschotels"]/p[2]//strong

哪个基于标题,或

//div[@class="column8 gerechten"]/p[2]//strong

它基于<div>元素的类。

这会给你一个想法:

$string = preg_replace('/s{1,}/', ' ', $string);
preg_match_all('/<strong>(.*?)<br />/', $string, $array);

for($i = 0; $i < count($array[1]); $i++){
$results[] = strip_tags($array[1][$i]);

}
array_pop($results);
print_r($results);

相关内容

最新更新