[英]Regex to linkify URLs
我目前有以下正則表達式以下列格式捕獲鏈接文本和URL:
[Link](http://link.com)
\\[(.+)]\\(((https?:\\/\\/(?:www\\.|(?!www))[^\\s\\.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,}))\\)
當我之后添加另一個表達式來鏈接URL時,它會使上述格式的內容混亂。
是否存在用於處理這兩種情況的單數正則表達式?
http://link.com
> <a href="http://link.com" target="_blank">http://link.com</a>
[Link](http://link.com)
-> <a href="http://link.com" target="_blank">Link</a>
PHP:
$string = preg_replace('/\[(.+)]\(((https?:\/\/(?:www\.|(?!www))[^\s\.]+\.[^\s]{2,}|www\.[^\s]+\.[^\s]{2,}))\)/', '<a href="$2" target="_blank">$1</a>', $string);
由於url語法可能非常復雜(太復雜而難以理解),因此沒有真正的方法來標識字符串中的url。 換句話說,您必須接受看起來像[...](...)
代表鏈接,而無需嘗試驗證(
和)
之間的內容是否確實是URL。 (之后,您始終可以使用parse_url
,但請記住,它可能會排除有效的url) 。
您正在尋找的是:
$result = preg_replace('~\[([^]]*)]\([^)]*\)~', '<a href="$2" target="_blank">$1</a>', $str);
// If you want to hunt lonely urls in your text, you can always search
// after extracting text nodes with XPath and a naive pattern like this:
$dom = new DOMDocument;
$dom->loadHTML($result);
$xp = new DOMXPath($dom);
$textNodes = $xp->query('//text()');
foreach($textNodes as $textNode) {
$textNode->nodeValue = preg_replace('~[hw](?:(?<=\bh)ttps?://|(?<=\bw)ww\.)\S+~i', '<a href="$0" target="_blank">$0</a>~', $textNode->nodeValue);
}
$result = $dom->saveHTML();
注意:為了獲得更好的結果,如果您絕對要檢查url,則可以將相同的模式與preg_replace_callback
,刪除匹配的最后一個字符,直到parse_url
有效並執行替換為止,但是效果不佳。
也許這對您有所幫助:
/**
* Linkify Function
* @param $tweet
* @return mixed
*/
function linkify_tweet($tweet)
{
//Convert urls to <a> links
$tweet = preg_replace("/([\w]+\:\/\/[\w-?&;#~=\.\/\@]+[\w\/])/", "<a href=\"mailto:w2m@bachecubano.com?subject=WEB $1\">$1</a>", $tweet);
//Convert hashtags to twitter searches in <a> links
$tweet = preg_replace("/#([A-Za-z0-9\/\.]*)/", "<a href=\"#\">#$1</a>", $tweet);
//Convert attags to twitter profiles in <a> links
$tweet = preg_replace("/@([A-Za-z0-9\/\.]*)/", "<a href=\"mailto:w2m@bachecubano.com?subject=MSG @$1\" class=\"userlink\">@$1</a>", $tweet);
return $tweet;
}
首先處理markdown語法。 然后捕獲未處理的純鏈接-您可以使用類似的正則表達式,但不帶括號。 如果您想替換所有在空白字符限制內(例如html都不匹配)的url,則可以這樣做:
\\s(https?:\\/\\/(?:www\\.|(?!www))[^\\s.]+\\.[^\\s]{2,}|www\\.[^\\s]+\\.[^\\s]{2,})
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.