【问题标题】:Regex queries - can anyone help?正则表达式查询 - 任何人都可以帮忙吗?
【发布时间】:2011-02-15 23:35:00
【问题描述】:

我仍在尝试掌握正则表达式,希望有人可以帮助进行简单的查询。我正在尝试解析我网站的主页并提取 H1 标签。

  <?php
    $string_get = file_get_contents("http://davidelks.com/");


    $replace = "$1";

    $matches = preg_replace ("/<h1 class=\"title\"><a href=\"([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*\">([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*<\/a><\/h1>/", $replace, $string_get, 1);

    $string_construct = "Mum " . $matches .  " Dad";

    echo ($string_construct);

    ?>

但是,它不仅仅使用 $1 标记显示第一个 HTML 链接,它只是拉入整个页面。

谁能帮忙?

【问题讨论】:

  • 您是想学习正则表达式,还是只是解析您的网站?如果是后者,我建议查找 DOM 解析器,例如 PHP 的 SimpleXML。
  • @Cole:您应该使用DOM 来解析网站。 SimpleXML 将只接受有效的 XML 或 XHTML。真正有效的 XHTML 很难找到。与 HTML 解析不同,一个错误,什么也没有发生。
  • 感谢您的帮助。
  • @netcoder 哦,对了,这是我以前用过的那个。多文档。感谢指正

标签: php regex html-parsing


【解决方案1】:

这看起来可以通过DOM parser 轻松完成:

libxml_use_internal_errors(true);
$dom = new DOMDocument;
$dom->load('http://davidelks.com/');
$h1 = $dom->getElementsByTagName('h1')->item(0);
echo $h1->textContent;

你应该得到:

Let's make things happen in and around Stoke-on-Trent

注意:我不确定这是您的网站还是您管理的网站,但 HTML 页面中不应有多个 &lt;h1&gt; 标记(有一个主页上的情侣)。

【讨论】:

  • 感谢您的建议。我是一名试图学习一些代码的记者,而正则表达式似乎是一种通过提取和连接特定元素来创建 HTML 的理想方式。我也很欣赏关于主页的提示。我去看看
  • 为什么一个页面不能有多个&lt;h1&gt;标签?
  • @CanSpice:因为&lt;h1&gt; 应该是页面中最相关的内容。通过拥有多个&lt;h1&gt; 标签,您可以赋予不同的内容片段相同的重要性。虽然尚不清楚WCAG 是否允许这样做(关于Meaningful Sequence in 1.3.2 的指导方针似乎很有意义),但搜索引擎通常使用&lt;h1&gt;&lt;title&gt; 标签来确定最重要的内容。通过重复它们,您可能会遇到错误解析的页面和较低的排名。
  • 它看起来好像是我拥有的 Drupal 模板的一部分。我去看看。
【解决方案2】:

错误在于您使用了preg_replace。您想提取一些东西,preg_match 将被使用:

<?php
 $text = file_get_contents("http://davidelks.com/");

 preg_match('#<h1 class="title"><a href="([\w\s\x21\/\-\.\£\:]*)">([^<>]*)</a></h1>#', $text, $match);

 echo "Mum " . $match[1] .  " Dad";
?>

请特别注意,您可以组合字符类。您不需要[A-Z]|[a-z]|[..],因为您可以将它组合成一个[A-Za-z...] 方括号列表。

如果您想在其中搜索双引号,请尝试对 PHP 字符串使用单引号。这节省了很多无关的转义。正则表达式周围的替代附件 # 而不是 / 也是如此。

【讨论】:

  • 谢谢。正如我所说,我正在学习,但绝对喜欢可用的善意和支持
【解决方案3】:

使用 DOM 解析器会更容易。但是如果你想用正则表达式来做,你应该在 php 中使用preg_match_all 函数:

preg_match_all("/<h1 class=\"title\"><a href=\"([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*\">([A-Z]|[0-9]|[a-z]|[\s]|[\x21]|[\/]|[\-]|[\.]|[\£]|[\:])*<\/a><\/h1>/",$string_get,$matches);
var_dump($matches);

【讨论】:

    猜你喜欢
    • 2011-07-10
    • 1970-01-01
    • 1970-01-01
    • 2013-09-18
    • 2015-05-09
    • 1970-01-01
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多