Php 正则表达式模式仅匹配不带www的链接

Php 正则表达式模式仅匹配不带www的链接,php,regex,expression,html-parsing,Php,Regex,Expression,Html Parsing,我正在尝试只搜索没有wwwlikehttp://google.com,或https://facebook.com,等等。然后我想将www添加到同一个链接,使其成为http://www.google.com,或https://www.facebook.com等 然而,我的模式有一个问题(我使用的模式可以获得所有有或没有www的链接) $text='blablablabla'; preg\u match \u all(“/]*href=(\”?)([^\“>]*?)\\1[^>]*>(.*)/siU

我正在尝试只搜索没有
www
like
http://google.com
,或
https://facebook.com
,等等。然后我想将
www
添加到同一个链接,使其成为
http://www.google.com
,或
https://www.facebook.com

然而,我的模式有一个问题(我使用的模式可以获得所有有或没有www的链接)

$text='blablablabla';
preg\u match \u all(“/]*href=(\”?)([^\“>]*?)\\1[^>]*>(.*)/siU“,$text,$matches);
foreach($old\u url与[2]匹配)
{
$text=str_replace($old_url“,$new_url“,$text);
}

以下是带有
的示例代码:

$re=“/bla bla bla bla bla\n”;
打印($str.“\n”);
$str=preg\u replace\u回调(
$re,
函数($matches){
返回str_replace($matches[2],“www.”$matches[2],$matches[0]);
},
$str
);
印刷品($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>
bla-bla-bla-bla-bla

< /代码> 我会考虑使用<强> 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()
进行替换。

这种模式有什么问题?@JayBlanchard(我使用的这种模式可以获取有或没有www的所有链接)我只搜索没有
www
的链接来为相同的linkthanx添加它,但效果不好,如果您尝试使用
$text='blablablablablablablabla'
和print
$matches[2]
您只有一个链接,但必须有两个链接。@Omardalo:我同意,贪婪的
(.*)
有问题。我用
(.*?
)替换了它,它工作正常。thanx brother现在工作得很好,你能帮我用结果替换它吗,在我得到没有www的链接后(我想在这个链接中添加www)
foreach($link[2]匹配为$link){$str=str\u替换($link,$link\u with\u www,$str);}
@omardealo:Done,请看一看。thanx兄弟太多了,但很抱歉我不能理解你的代码,你能解释一下吗,就像这是我的var内容
$this->post['message']
我怎么能用你的代码来使用它。是的,我已经更改了,我的意思是在
str\u replace
行中使用了
$this->post['message']
,对吗<代码>$this->post['message']=str_replace($url['host'],'www.$url['host'],$this->post['message'])http://google.com 布拉布拉http://google.com
第一个链接可以,但第二个链接类似于
http://www.www.google.com/
如果有三个链接,将添加更多的
www
<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>
$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
   ...
   ...
 }