php正则表达式从href中提取/不使用www http https提取特定域

时间:2018-05-19 18:48:57

标签: php regex

我正在尝试检查包含特定域的标签...但这个标签可能包含或不包含wwwhhtphttps

$a = '  <a href="https://example.com"></a>
                <a href="http://www.example.com"></a> 
                <a href="http://example.com"></a> 
                <a href="https://www.example.com"></a> 
                <a href="http://example.com"></a> 
                ';
        $reg_exUrl = "/(http|https)\:\/\/(www.)?example+\.com(\/\S*)?/";

        preg_match($reg_exUrl, $a, $url) ;
        var_dump($url);

但我没有得到所有链接这是输出

array:2 [▼
  0 => "https://example.com"
  1 => "https"
]

我也不确定如何包含href所以它只会搜索href

4 个答案:

答案 0 :(得分:2)

使用HTML解析器,然后使用URL解析器获取域。从那里使用有限字符串的正则表达式:

$a = '  <a href="https://example.com"></a>
                <a href="http://www.example.com"></a> 
                <a href="http://example.com"></a> 
                <a href="https://www.example.com"></a> 
                <a href="http://example.com"></a> 
                ';
$dom = new DOMDocument;
$dom->loadHTML($a);
$links = $dom->getElementsByTagName('a');
foreach($links as $link) {
    $host = parse_url($link->getAttribute('href'))['host'];
    if(!empty($host) && preg_match('/(^|\.)example\.com$/', $host)) {
         echo 'Expected domain';
    } 
}

还要详细解释当前输出的内容...... preg_match输出找到的第一个匹配项,每个索引都是一个捕获组。

 $reg_exUrl = "/(http|https)\:\/\/(www.)?example+\.com(\/\S*)?/";
                 ^^^^^^^^^^        ^^^^                ^^^^^

如上所示,您有3个可能的捕获组。您可以在它们的开头使用?:,以便不会捕获它。您http|https可以简化为https??使s成为可选。

答案 1 :(得分:0)

而不是preg_match,请使用preg_match_all

UPD :所有网址正则表达式:

$regex = '/href="(.*?)"/';

答案 2 :(得分:0)

你有:

$a = '  <a href="https://example.com"></a>
            <a href="http://www.example.com"></a> 
            <a href="http://example.com"></a> 
            <a href="https://www.example.com"></a> 
            <a href="http://example.com"></a> 
            ';
    $reg_exUrl = "/href=\"(?:https?)\:\/\/(?:www\.)?example\.com\"/";

    preg_match_all($reg_exUrl, $a, $url) ;
    var_dump($url);

答案 3 :(得分:0)

使用preg_match_all

    $reg_exUrl = '/href="(.*?)"/';

    preg_match_all($reg_exUrl, $a, $url) ;
    echo "<pre>";
    print_r($url);