簡體   English   中英

正則表達式鏈接URL

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM