【问题标题】:Having trouble with preg_match_all [duplicate]preg_match_all 遇到问题 [重复]
【发布时间】:2013-02-18 21:24:13
【问题描述】:

这是我的代码:

preg_match_all('/<a href="(.+?)index.php(.+?)&abc=(.+?)"/', $dataToParse, $matches);

foreach ($matches as $val)
{
    $absUrl = $val[1] . 'index.php' . $val[2] . '&abc=' . $val[3];

    echo $absUrl;
}

但是,$val[1] 是整个匹配字符串,包括 &lt;a href。我相信我的语法错误,但我一直在尝试修复它,但没有运气。不确定如何正确执行此操作。

【问题讨论】:

  • 正确执行会涉及到 DOM 解析器,而不是使用正则表达式来解析 HTML。
  • 现在是 2013 年。使用 XML 解析器。
  • @JackManey:继承了一个与其他人一起这样做的项目。
  • 不要使用正则表达式解析 HTML。您无法使用正则表达式可靠地解析 HTML。一旦 HTML 与您的期望发生变化,您的代码就会被破坏。有关如何使用 PHP 模块正确解析 HTML 的示例,请参阅 htmlparsing.com/php.html
  • e 没有解析 HTML,e 正在解析 URL。

标签: php regex html-parsing


【解决方案1】:

尝试在$matches 之后传递常量PREG_SET_ORDER,如下所示:

preg_match_all("/.../",$dataToParse,$matches,PREG_SET_ORDER);

有关原因的更多信息,请参阅documentation

【讨论】:

    【解决方案2】:

    $matches[0] 是整个字符串,$matches[1] 是第一个匹配组,$matches[2] 是第二个匹配组,以此类推。

    for( $i = 0; $i < count( $matches[1]); $i++)
    {
        $absUrl = $matches[1][$i] . 'index.php' . $matches[2][$i] . '&abc=' . $matches[3][$i];
        echo $absUrl;
    }
    

    【讨论】:

    • 答案中有鬼。
    猜你喜欢
    • 2020-06-21
    • 1970-01-01
    • 2017-04-11
    • 2014-01-02
    • 2012-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-12
    相关资源
    最近更新 更多