preg_match_all读取sitesource多行和匹配

时间:2016-06-18 17:19:14

标签: php html regex preg-match-all

我使用file_get_contents阅读我自己的网站以显示特定文字。我展示了访谈中的数据,我希望获得访谈标题和在其他网站上使用的时间(链接到访谈)。

相关代码块在表格中。

<td>
    Interview 1
    <small style="color:gray">
        Persons 2
        Cameras 2
    </small>
</td>
<td>
    1018 min
</td>

如您所见,Interview 1是标题,时间是1018。我自己尝试了这个,但不知怎的,模式有点疯狂。

preg_match_all('#<td>\s*(.+?)\s*<small style="color:gray">\s*<\/small>\s*<\/td><td>\s*(.+?)\s*<\/td>#is', $mysite, $match)

我使用\s*表示换行符和空格,并使用(.+?)进行匹配。我的搜索模式有什么问题?

3 个答案:

答案 0 :(得分:0)

首先,您应该使用解析器,预期HTML函数的正则表达式。你的正则表达式有两个问题。

问题一:

<small style="color:gray">\s*<\/small>

该元素之间不仅有空格。

问题二:

<\/td><td>

<td>之间有一个新行。

所以:

<td>\s*(.+?)\s*<small style="color:gray">.+?<\/small>\s*<\/td>\s<td>\s*(.+?)\s*<\/td>

应该适合你(对于这个静态的例子)。如果small元素的内容是可选的,请将+更改为*。还要注意解析器这些不会出现问题。

答案 1 :(得分:0)

以下是DOMDocument的解决方案:

$doc = new DOMDocument();
$doc->loadHTML($html);
$xpath = new DOMXpath($doc);
foreach ($xpath->query('//td/small[@style="color:gray"]') as $small) {
    $td2 = $td = $small->parentNode;
    do $td2 = $td2->nextSibling; while($td2->nodeType != 1);
    $match[] = ["headline" => trim($td->firstChild->textContent), 
                "time" => trim($td2->textContent)];
}
print_r($match);

答案 2 :(得分:0)

有效:

preg_match_all( '#<td>\s*(.*)\s*<small style="color:gray">.*</small>\s*</td>\s*<td>\s*(.*)\s*</td>#is', $mysite, $match);