只匹配没有 www 的链接的正则表达式模式
Regular expression pattern to match only links without www
我正在尝试仅搜索 link 没有 www
的 http://google.com
,或 https://facebook.com
等。然后我想添加 www
到相同的 link 所以它变成 http://www.google.com
,或者 https://www.facebook.com
,等等
但是,我的模式有问题(我用来获取所有带或不带 www 的 link 的模式)。
$text = '<a href="http://google.com">google</a> bla bla bla <a href="https://www.google.com">google</a>';
preg_match_all("/<a\s[^>]*href=(\"??)([^\" >]*?)\1[^>]*>(.*)<\/a>/siU", $text, $matches);
foreach ($matches[2] as $old_url)
{
$text = str_replace("$old_url","$new_url",$text);
}
下面是使用 <a\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\1)([^'\">]+?)\1[^>]*>(.*?)<\/a>
正则表达式的示例代码,仅匹配 href 属性中没有 www
的网址。
$re = "/<a\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\1)([^'\">]+?)\1[^>]*>(.*?)<\/a>/";
$str = "<a href=\"http://google.com\">google</a> bla bla bla <a href=\"https://www.google.com\">google</a> bla bla bla <a href=\"http://facebook.com\">facebook</a>\n";
print ($str . "\n");
$str = preg_replace_callback(
$re,
function ($matches) {
return str_replace($matches[2], "www." . $matches[2], $matches[0]);
},
$str
);
print ($str);
输出:
<a href="http://www.google.com">google</a> bla bla bla <a href="https://www.google.com">google</a> bla bla bla <a href="http://www.facebook.com">facebook</a>
我会考虑使用 DOM 和 XPath 来为您解决这个问题。
$doc = new DOMDocument;
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$links = $xpath->query('//a[not(contains(@href, "www."))]/@href');
foreach ($links as $link) {
// process yours urls by $link->nodeValue
...
...
}
您可能会在处理 url 时使用 parse_url()
进行替换。
我正在尝试仅搜索 link 没有 www
的 http://google.com
,或 https://facebook.com
等。然后我想添加 www
到相同的 link 所以它变成 http://www.google.com
,或者 https://www.facebook.com
,等等
但是,我的模式有问题(我用来获取所有带或不带 www 的 link 的模式)。
$text = '<a href="http://google.com">google</a> bla bla bla <a href="https://www.google.com">google</a>';
preg_match_all("/<a\s[^>]*href=(\"??)([^\" >]*?)\1[^>]*>(.*)<\/a>/siU", $text, $matches);
foreach ($matches[2] as $old_url)
{
$text = str_replace("$old_url","$new_url",$text);
}
下面是使用 <a\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\1)([^'\">]+?)\1[^>]*>(.*?)<\/a>
正则表达式的示例代码,仅匹配 href 属性中没有 www
的网址。
$re = "/<a\s[^>]*href=([\"']?)(?>https?|ftps?):\/\/(?![^'\">]*www[^\"]+?\1)([^'\">]+?)\1[^>]*>(.*?)<\/a>/";
$str = "<a href=\"http://google.com\">google</a> bla bla bla <a href=\"https://www.google.com\">google</a> bla bla bla <a href=\"http://facebook.com\">facebook</a>\n";
print ($str . "\n");
$str = preg_replace_callback(
$re,
function ($matches) {
return str_replace($matches[2], "www." . $matches[2], $matches[0]);
},
$str
);
print ($str);
输出:
<a href="http://www.google.com">google</a> bla bla bla <a href="https://www.google.com">google</a> bla bla bla <a href="http://www.facebook.com">facebook</a>
我会考虑使用 DOM 和 XPath 来为您解决这个问题。
$doc = new DOMDocument;
@$doc->loadHTML($html);
$xpath = new DOMXPath($doc);
$links = $xpath->query('//a[not(contains(@href, "www."))]/@href');
foreach ($links as $link) {
// process yours urls by $link->nodeValue
...
...
}
您可能会在处理 url 时使用 parse_url()
进行替换。