找到特定字符串并捕获其后的数据

时间:2009-11-09 20:19:16

标签: php html parsing

我很久以前建立了一个网站,现在我想把数据放到一个数据库中,而不是复制和粘贴它已经增长到的400多个页面,这样我就可以驱动网站数据库了。

我的网站有这样的元标记(每个页面不同):

<meta name="clan_name" content="Dark Mage" />

所以我正在做的是使用cURL将整个HTML页面作为字符串放在变量中。我也可以用fopen等来做...但我认为不重要。

我需要通过字符串来查找'Dark Mage'并将其存储在变量中(所以我可以放入sql)

关于找到Dark Mage存储在变量中的最佳方法的任何想法?我试图使用substr然后从clan_name中减去e中的字符数,但那是一个半身像。

3 个答案:

答案 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="([^"]+)"/