【问题标题】:PHP: Regular expression / preg_match() until EOLPHP:正则表达式 / preg_match() 直到 EOL
【发布时间】:2013-06-04 03:16:24
【问题描述】:

在 HTML 页面中是这样的一行:

<p><strong>State:</strong> <a href="/state/show/Ohio">Ohio</a></p>

我正在寻找的是一个正则表达式,它获取 &lt;strong&gt;State:&lt;/strong&gt; 和 EOL 之间的内容。

我已经尝试过了,但它不起作用,因为它忽略了&lt;/a&gt;&lt;/p&gt;-"end"

preg_match('/<strong>State:(.*)<\/a><\/p>/',$html,$format);

【问题讨论】:

  • 您能否更新您的帖子,提供您对该案例所期望的确切输出?你想要State: Ohio吗?如果是这样...只需将 (.*) 替换为 .*
  • 如果你想匹配到行尾,你可以使用&lt;strong&gt;State:(.*)
  • 任何不考虑 html 解析器的理由。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php regex html-parsing preg-match


【解决方案1】:

说明

此正则表达式将找到 &lt;p&gt;&lt;strong&gt;State:&lt;/strong&gt; 并将从 &lt;/strong&gt; 到行尾的所有内容返回到第 1 组。请注意,通过包含 $ 符号,您还需要包含 m 选项以强制正则表达式允许$ 匹配行尾。

使用您的示例文本:&lt;p&gt;&lt;strong&gt;State:&lt;/strong&gt; &lt;a href="/state/show/Ohio"&gt;Ohio&lt;/a&gt;&lt;/p&gt;

正则表达式:&lt;p&gt;&lt;strong&gt;State:(&lt;/strong&gt;.*?$)

第 1 组将有 &lt;/strong&gt; &lt;a href="/state/show/Ohio"&gt;Ohio&lt;/a&gt;&lt;/p&gt;

如果你真的想直接在强标签组之后捕获锚标签,不包括关闭&lt;/p&gt;,那么试试这个:

正则表达式:&lt;p&gt;&lt;strong&gt;State:&lt;/strong&gt;\s*(.*?)&lt;/p&gt;$

第 1 组将有 &lt;a href="/state/show/Ohio"&gt;Ohio&lt;/a&gt;

免责声明

从长远来看,使用正则表达式解析 HTML 可能不是最容易维护的事情。但是,如果您可以控制输入文本,则文本仍然非常简单,并且您愿意遇到常规表达式可能失败的周期性边缘情况,那么正则表达式将为您工作。

PHP Html 解析

肥皂盒够了。如果您已准备好研究 PHP 中的 html 解析,请查看以下示例:拉取页面上的所有锚标记并返回其 href 属性和链接文本:

$dom = new DOMDocument;
$dom->loadHTML(file_get_contents('http://www.YourPageHere.com/')); 

// echo Links and their anchor text
echo '<pre>';
echo "Link\tAnchor\n";
    foreach($dom->getElementsByTagName('a') as $link) {
    $href = $link->getAttribute('href');
    $anchor = $link->nodeValue;
    echo $href,"\t",$anchor,"\n";
    }
echo '</pre>';

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-05
    • 2014-06-28
    • 1970-01-01
    • 2012-01-14
    • 1970-01-01
    相关资源
    最近更新 更多