【问题标题】:Regex to pull match from ordered list正则表达式从有序列表中提取匹配
【发布时间】:2013-06-22 00:15:13
【问题描述】:

给定这串文本:

$myString = '<details class="myEl" open="open">
        <summary>In this article</summary>
        <ol>
                <li><a href="post-slug/">Introduction</a></li>
                <li><a href="post-slug/2/">Title for the second page</a></li>
                <li><a href="post-slug/3/">Title for the third page</a></li>
        </ol>
</details>';

如果我知道要搜索的匹配项是“/2/”,那么正则表达式会提取“第二页的标题”吗?

如果匹配是“/3/”,我还需要提取“第三页的标题”,所以我需要一个通用的正则表达式,它将在匹配后拉出 > 和

【问题讨论】:

  • 你的对手是什么?你是怎么得到它的?
  • 匹配始终是两个正斜杠“/n/”之间的数字。所以我需要从那里开始并在匹配之后查找 > 和
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用已经编写、测试和调试的 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php

标签: php regex html-parsing


【解决方案1】:

试试这个:

preg_match('!\/' . $pageNo . '\/">(.*?)\<\/a\>!', $myString, $matches);
$pageTitle = $matches[1];

编辑: 第 1 页应该适用于这个:

preg_match('!\/' . ($pageNo == 1 ? ($pageNo . '\/') : '') . '">(.*?)\<\/a\>!', $myString, $matches);
$pageTitle = $matches[1];

【讨论】:

  • 最好添加 a 标签的完整开头以限制误报的风险。但这应该有效,并且是有效的回复投票
【解决方案2】:

我想最好使用 XPath 来做这样的事情,一个例子是:

$str = '<details class="myEl" open="open">
        <summary>In this article</summary>
        <ol>
                <li><a href="post-slug/">Introduction</a></li>
                <li><a href="post-slug/2/">Title for the second page</a></li>
                <li><a href="post-slug/3/">Title for the third page</a></li>
        </ol>
</details>';

$xml = simplexml_load_string($str);
var_dump($xml->xpath('//details/ol/li/a[contains(@href, "/3/")]'));

但是对于正则表达式,以下正则表达式可以完成工作:

preg_match_all('@<li><a href="post-slug/3/">((?:(?!<\/a>).)+)</a></li>@', $str, $matches);
print_r($matches);

【讨论】:

  • Regexp 将比使用 simplexml 加载字符串快得多
  • 我不是在谈论性能。只是分享提取所需信息的方法。
  • 好的,但问题是关于正则表达式的,你猜 xpath 会更好。这在性能和操作问题上都不是真的。 +您的解决方案仅适用于索引 3,不适用于其他情况
  • 我认为一个例子对开发人员来说足够公平,可以按照他的意愿实现其余部分。但看起来人们正在寻求实施的解决方案,而不是自己做的知识。
  • 没关系,欢迎提出替代方案。但我只是想指出你的猜测是不正确的(说“另一种方式可能是”而不是“我猜它更好”是完全不同的事情)。此外,您的回复过去和现在仍然不完整。我想我可能对你有点粗鲁,因为我拒绝编辑你的答案,我会删除它
猜你喜欢
  • 2011-01-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2015-03-08
  • 1970-01-01
相关资源
最近更新 更多