【问题标题】:How to find a URL from a content by PHP?如何通过 PHP 从内容中查找 URL?
【发布时间】:2009-09-19 21:46:21
【问题描述】:

需要一个简单的preg_match,它会在内容中找到“c.aspx”(不带引号),如果找到,它将返回整个url。举个例子

$content = '<div>[4]<a href="/m/c.aspx?mt=01_9310ba801f1255e02e411d8a7ed53ef95235165ee4fb0226f9644d439c11039f%7c8acc31aea5ad3998&amp;n=783622212">New message</a><br/>';

现在它应该从 $content preg_match "c.aspx" 并给出一个输出

"/m/c.aspx?mt=01_9310ba801f1255e02e411d8a7ed53ef95235165ee4fb0226f9644d439c11039f%7c8acc31aea5ad3998&amp;n=783622212"

$content 应该有更多的链接,除了“c.aspx”。我不想要他们。我只想要所有具有“c.aspx”的网址。

请告诉我该怎么做。

【问题讨论】:

    标签: php regex dom preg-match


    【解决方案1】:

    您使用 DOM 来解析 HTML,而不是正则表达式。您可以使用正则表达式来解析属性值。

    编辑:更新示例,以便检查 c.aspx。

    $content = '<div>[4]<a href="/m/c.aspx?mt=01_9310ba801f1255e02e411d8a7ed53ef95235165ee4fb0226f9644d439c11039f%7c8acc31aea5ad3998&amp;n=783622212">New message</a>
    
    <a href="#bar">foo</a>
    
    <br/>';
    
    $dom = new DOMDocument();
    $dom->loadHTML($content);
    
    $anchors = $dom->getElementsByTagName('a');
    
    if ( count($anchors->length) > 0 ) {
        foreach ( $anchors as $anchor ) {
            if ( $anchor->hasAttribute('href') ) {
                $link = $anchor->getAttribute('href');
                if ( strpos( $link, 'c.aspx') ) {
                    echo $link;
                }
            }
        }
    }
    

    【讨论】:

    • 还有一个 PHP 函数 parse_url() 从 href 属性中提取 URL 后可以使用它
    • @meder - 投了赞成票,说真的,我爱你。对于这个问题,没有正则表达式解决方案。
    【解决方案2】:

    如果你想找到任何带有 c.aspx 的带引号的字符串:

    /"[^"]*c\.aspx[^"]*"|'[^']*c\.aspx[^']*'/
    

    但实际上,为了解析大多数 HTML,您最好使用某种 DOM 解析器,这样您就可以确定您匹配的是真正的 href。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-12-20
      • 1970-01-01
      • 2016-12-14
      • 2018-03-13
      • 1970-01-01
      • 2019-07-29
      • 2017-04-03
      相关资源
      最近更新 更多