如果我有一個包含普通URL的段落(沒有錨點)。如何將這些網址封裝在代碼中?如何將單詞轉換爲使用PHP的字符串中的鏈接?
例如:
$string = "visit http://blabla.com to get something";
所以我怎麼會作出這樣的:
visit <a href="http://blabla.com">http://blabla.com</a> to get something
謝謝!
如果我有一個包含普通URL的段落(沒有錨點)。如何將這些網址封裝在代碼中?如何將單詞轉換爲使用PHP的字符串中的鏈接?
例如:
$string = "visit http://blabla.com to get something";
所以我怎麼會作出這樣的:
visit <a href="http://blabla.com">http://blabla.com</a> to get something
謝謝!
$str = "so i found this sweet website, http://www.stackoverflow.com you should check it out";
$modified = preg_replace("@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@", "<a href='$1' target='_blank'>$1</a>", $str);
echo $modified;
或函數中
function linkUrls($str) {
return preg_replace("@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?)@", "<a href='$1' target='_blank'>$1</a>", $str);
}
$str = "blah blah http://www.stackoverflow.com jaejg";
echo linkUrls($str);
可以忽略$ 1 。它被分配給正則表達式匹配的文本。在這種情況下,URL。
這是我使用這樣做的功能,我沒有寫出來,看代碼源
function urls2linksComplex($text,$schemes = 'normal',$tlds = 'normal'){
//"urls2links - Complex" function by mBread @ SwirlDrop/m-bread web labs (http://m-bread.com/lab/php/urls2linksComplex)
//This functon is free to distribute and modify, but please leave these comments intact.
if($schemes=='normal'){
$scheme = '(?:[Hh][Tt]|[Ff])[Tt][Pp][Ss]?';
}elseif(is_array($schemes)){
$scheme = '(?:'.implode('|',$schemes).')';
}elseif(is_string($schemes)){
$scheme = $schemes;
}else{
$scheme = '[a-zA-Z][a-zA-Z0-9\-+.]*';
}
; //EoIF
if($tlds=='normal'){
$tldExclude = array(
'doc','xls','txt','rtf','jpeg','jpg','gif','png','exe','html','htm','zip','gz','scr','rar','php','php3','inc','ico','bmp','asp','jsp','dat','lnk','cab','csv','xml','xsl','xsd','svg','psp','psd','pdf','bak','wav','mp3','m4v','midi','wmv','wma','js','css','ppt','pps','mdb');
}elseif(is_array($tlds)){
$tldExclude = $tlds;
}elseif(is_string($tlds)){
$tldExclude = array(
$tlds);
}else{
$tldExclude = array();
}
; //EoIF
$userinfo = '(?:(?:[a-zA-Z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*@)?';
$decOctet = '(?:[0-9]|[0-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5])';
$ipv4 = '(?:'.$decOctet.'\.){3}'.$decOctet;
$regname = '(?:(?:[0-9A-Za-z][0-9A-Za-z\-]*[0-9A-Za-z]|[0-9A-Za-z])\.)+[a-zA-Z]{2,6}';
$host = '('.$ipv4.'|'.$regname.')';
$port = '(?::[0-9]*)?';
$authority = '((?://)?'.$userinfo.$host.$port.')';
$path = '(?:/(?:[a-zA-Z0-9\-._~!$&\'()*+,;=:]|%[0-9A-Fa-f]{2})*?)*';
$query = '(?:\?(?:[a-zA-Z0-9\-._~!$&\'()*+,;=:/?]|%[0-9A-Fa-f]{2})*?)?';
$fragment = '(?:#(?:[a-zA-Z0-9\-._~!$&\'()*+,;=:/?]|%[0-9A-Fa-f]{2})*?)?';
$pattern = '\b(('.$scheme.'\:)?'.$authority.$path.$query.$fragment.')($|[^\w/][<\s]|[<\s]|[^\w/]$)';
$replacement = '(!in_array(substr(\'$4\', strrpos(\'$4\', \'.\')+1), $tldExclude))?\'<a href="\'.((\'$2\' == \'\')?((strpos(\'$3\', \'@\'))?\'mailto:$1\':\'http://$1\'):\'$1\').\'">$1</a>$5\':\'$0\'';
//$pattern=strip_tags($pattern);
$text = preg_replace('`'.$pattern.'`e',$replacement,$text);
$text = preg_replace('`<a href="(.*)"><a href="(.*)">`','<a href="$1">',$text);
$text = str_replace('</a></a>','</a>',$text);
return $text;
}
這太棒了。 – aurel
嗨,這是如何工作的?什麼值是$ 1和$ str - 謝謝 – aurel
^^編輯顯示實際的例子 –
謝謝,這是美麗的 – aurel