使用参数定位URL

时间:2018-08-27 14:08:49

标签: php regex

我想获取最高pg值的URL:

$html ='
    <a href="http://example.com/?pg=1"></a>
    <a href="http://example.com/?pg=2"></a>
    <a href="http://example.com/?pg=3"></a>
';

我使用此正则表达式找到相应的链接:

preg_match_all('/<a.*href="\.\/\?pg=(\d+)".*>(?:.*)<\/a>/U', $html, $preg_matches);

有时,链接包含另一个参数:

http://example.com/?pg=3&test=1

我的问题是,如何调整我的正则表达式,以便同时包含带有添加的参数的链接?

2 个答案:

答案 0 :(得分:1)

  1. 使用DOM解析器查找锚点。
  2. 使用parse_url解析网址并获取查询值
  3. 使用parse_str获取查询值

示例:

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

$html ='
    <a href="http://example.com/?pg=1"></a>
    <a href="http://example.com/?pg=2"></a>
    <a href="http://example.com/?pg=3"></a>
';
$anchors = $dom->getElementsByTagName('a');

foreach ($anchors as $anchor) {
        $url = $anchor->getAttribute('href');
        $query = parse_url($url, PHP_URL_QUERY);
        parse_str($query, $output);
        $pg = $output['pg'];
        //do something
}

这是有关PHP的有用教程。 http://htmlparsing.com/php.html

也请参见此处,为什么不应该使用Regex解析html https://stackoverflow.com/a/1732454/81785

答案 1 :(得分:0)

        $html ='
        <a href="http://example.com/?pg=1"></a>
        <a href="http://example.com/?pg=2"></a>
        <a href="http://example.com/?pg=4&test=1"></a>
    ';
        preg_match_all('/<a[^>]+href=\"(.*?)\"[^>]*>(.*)?<\/a>/', $html, $out);

        $result = null;
        foreach ($out[1] as $link){
            parse_str(parse_url($link, PHP_URL_QUERY), $atr);
            $result[$link] = $atr['pg'];
        }

        print_r($result);

//        "http://example.com/?pg=1" => "1"
//        "http://example.com/?pg=2" => "2"
//        "http://example.com/?pg=4&test=1" => "4"