我很久以前建立了一个网站,现在我想把数据放到一个数据库中,而不是复制和粘贴它已经增长到的400多个页面,这样我就可以驱动网站数据库了。
我的网站有这样的元标记(每个页面不同):
<meta name="clan_name" content="Dark Mage" />
所以我正在做的是使用cURL将整个HTML页面作为字符串放在变量中。我也可以用fopen等来做...但我认为不重要。
我需要通过字符串来查找'Dark Mage'并将其存储在变量中(所以我可以放入sql)
关于找到Dark Mage存储在变量中的最佳方法的任何想法?我试图使用substr然后从clan_name中减去e中的字符数,但那是一个半身像。
答案 0 :(得分:4)
使用PHP DOM函数解析页面,特别是loadHTML()。然后,您可以遍历树或使用xpath查找要查找的节点。
<?
$doc = new DomDocument;
$doc->loadHTML($html);
$meta = $doc->getElementsByTagName('meta');
foreach ($meta as $data) {
$name = $meta->getAttribute('name');
if ($name == 'clan_name') {
$content = $meta->getAttribute('content');
// TODO handle content for clan_name
}
}
?>
编辑如果要在将HTML字符串加载到内存之前删除某些标记(例如<script>
),请尝试使用strip_tags()
功能。像这样的东西只会保留元标记:
<?
$html = strip_tags($html, '<meta>');
?>
答案 1 :(得分:2)
使用正则表达式,如下所示,使用PHP的 preg_match():
/<meta name="clan_name" content="([^"]+)"/
如果您不熟悉正则表达式,请继续阅读。
开头和结尾的正斜杠分隔正则表达式。分隔符内的东西非常简单,除了最后。
方括号分隔字符类,字符类开头的插入符号是否定运算符;然后,这个角色类:
[^"]
表示“匹配任何不是双引号的字符”。
+是一个量词,它要求前面的项目至少出现一次,并且匹配前面的项目与第一项相同。所以这个:
[^"]+
表示“匹配一个或多个不是双引号的字符”。
最后,括号使常规表达式引擎在子模式中存储它们之间的任何内容。所以这个:
([^"]+)
表示“匹配一个或多个不是双引号的字符,并将它们存储为匹配的子模式。
在PHP中,preg_match()将匹配存储在您通过引用传递的数组中。完整模式存储在数组的第一个元素中,第一个子模式存储在第二个元素中,依此类推,如果有其他子模式。
因此,假设您的HTML页面位于变量“$ page”中,请使用以下代码:
$matches = array();
$found = preg_match('/<meta name="clan_name" content="([^"]+)"/', $page, $matches);
if ($found) {
$clan_name = $matches[1];
}
应该得到你想要的东西。
答案 2 :(得分:1)
使用preg_match。可能的正则表达式模式为/clan_name.+content="([^"]+)"/