我正在尝试检查包含特定域的标签...但这个标签可能包含或不包含www
,hhtp
,https
$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
答案 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);