【问题标题】:PHP preg_match get $_GET values in href linksPHP preg_match 在 href 链接中获取 $_GET 值
【发布时间】:2014-05-16 14:35:53
【问题描述】:

我想从下面的示例中获取 t 值,例如 558246017
preg_match_all 函数无法做到这一点。

$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>';
preg_match_all('/<a target="frameleft" href="Home.aspx?t=\d+">(.*?)<\/a>/si', $str, $matches);
print_r($matches);

请帮我解决这个问题。

【问题讨论】:

  • 不要使用正则表达式解析 HTML。使用适当的 HTML 解析模块。 您无法使用正则表达式可靠地解析 HTML,并且您将面临悲伤和挫败感。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。请参阅htmlparsing.com/phpthis SO thread,了解如何使用已经编写、测试和调试过的 PHP 模块正确解析 HTML。

标签: php html-parsing preg-match-all


【解决方案1】:

HTML 不是正则语言,无法使用正则表达式进行可靠解析。我建议您改用 DOM 解析器。 PHP 有一个内置类 (DOMDocument) 擅长此类任务。与正则表达式相比,使用 HTML 解析器的优势在于您始终可以确定结果。当标记的格式将来发生变化时,基于正则表达式的解决方案可能会中断,而基于 DOM 解析器的解决方案则不会。

您可以使用 DOMDocument 加载字符串并首先获取href 属性值。然后使用parse_url()parse_str()获取所需参数:

$str = '<a target="frameleft" href="Home.aspx?t=558246017">START</a>';

$dom = new DOMDocument;
$dom->loadHTML($str);

foreach ($dom->getElementsByTagName('a') as $tag) {
    $querystr = parse_url($tag->getAttribute('href'), PHP_URL_QUERY);
    parse_str($querystr, $params);
    echo $params['t'] . PHP_EOL;
}

输出:

558246017

Demo

【讨论】:

  • @amal-murali 非常感谢。与您的代码一样,如果不使用 ['t']print_r ,我将无法获得诸如 &lt;a class="titr1y" target="_blank" title="" href="/EN/news/397423/TEST&lt;/a&gt; 之类的 href 值。
  • @TuxWorld:在可能不存在查询字符串的情况下,您希望输出什么?请更新问题以包含更多详细信息和预期输出。
【解决方案2】:

HTML 不是常规语言,所以你 should not use regular expressions to parse it。请改用 DOMDocument 之类的 DOM 解析器。不过,为了学习,我会说明你的表达有什么问题。

但是,您的问题是 ?reserved character 意思是“可选”,. 是保留字符,意思是任何字符。使用\ 逃脱他们:

<a target="frameleft" href="Home\.aspx\?t=\d+">(.*?)<\/a>

另外,s modifier 表示点匹配换行符。因此,除非您希望链接中包含换行符,否则这是不必要的。


我也刚刚注意到您想要“t”值。目前,您在链接的内容 ((.*?)) 上使用 capture group,而不是您想要捕获 t 的值 (\d+)。您需要将其修改为:

<a target="frameleft" href="Home\.aspx\?t=(\d+)">.*?<\/a>

【讨论】:

  • 喜欢你的代码preg_match_all('&lt;form method="post" action="Desktop\/Login\.aspx\?t=(\d+)"&gt;', $str, $matches); 不适合我。那就是返回null
  • 我将其更改为 '/&lt;form method="post" action="Desktop\/Login\.aspx\?t=(\d+)"&gt;/i' 但返回 null
  • 现在是表格?它适用于我的测试,你需要用一个不起作用的例子来更新你的问题。
猜你喜欢
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-13
  • 1970-01-01
  • 2022-11-28
  • 2011-02-05
  • 1970-01-01
相关资源
最近更新 更多