我使用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*
表示换行符和空格,并使用(.+?)
进行匹配。我的搜索模式有什么问题?
答案 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);