2013-02-24 42 views
2

我有很大的問題,理解如何使用preg_replace與反向引用。PHP - preg_replace反向引用

我有一個純文本字符串,並希望用鏈接的HTML語法替換每個鏈接。因此,應將「www.mydomain.tld」或「http://www.mydomain.tld」或「http://mydomain.tld」包裝在HTML標籤中。我發現了一個可以在線執行此功能的工作功能,但我想了解如何自己做。

在我發現的功能,這是更換:

"\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>" 

我看到有一些逃脫了引號,並且這些位:\\1\\2
根據PHP文檔,這些是反向引用。但是,我如何使用它們,他們做了什麼?

我在規範中沒有發現任何問題,所以任何幫助將不勝感激!

+0

你有看到這個http://php.net/manual/en/regexp.reference.back-references.php或http://www.regular-expressions.info/brackets.html嗎? – elclanrs 2013-02-24 00:22:13

+0

這些不是反向引用。在這種情況下,他們是比賽組佔位符。 – mario 2013-02-24 00:24:24

回答

3

這將爲你完成這項工作。請參閱下面的說明,瞭解它是如何工作的。

$string = 'some text www.example.com more text http://example.com more text https://www.example.com more text'; 

$string = preg_replace('#\b(?:http(s?)://)?((?:[a-z\d-]+\.)+[a-z]+)\b#', "<a href='http$1://$2'>http$1://$2</a>", $string); 

echo $string; // some text <a href='http://www.example.com'>http://www.example.com</a> more text <a href='http://example.com'>http://example.com</a> more text <a href='https://www.example.com'>https://www.example.com</a> more text 

\b匹配單詞邊界 (?:http(s?)://)?可選匹配的字符串,如果它包含'http://''https://',如果HTTPS搶's'所以我們可以建立正確的URL

(?:[a-z\d-]+\.)+比賽中的一個或一系列字母更發生/數字後跟一段時間

[a-z]+匹配一個或多個字母,頂級域名,註釋頂級域名現在已經開放供購買,所以不能再限制長度了。請參閱http://tinyurl.com/cle6jqb

然後我們通過將它們括在圓括號中,在反向引用中捕獲除了's'之外的最後兩個部分。

然後,我們建立的網址:

<a href='http$1://$2'>http$1://$2</a> 

http$1://創建HTTP如果HTTPS反向引用$1將包含一個's'

$2將包含域名。我們建立URL鏈接的鏈接文本。

+0

你怎麼能在$ 1333 $ 2中逃避兩個反向引用之間的數字333? – peter 2017-04-20 14:19:39

1

你可能想使用類似這樣:

$string = preg_replace('/^(https?:\/\/)?([\da-z\.-]+)\.([a-z\.]{2,6})([\/\w \.-]*)*\/?$/ ', "<a href=\"$1\">Link</a>", $yourtext); 

一些有用的鏈接:
嘗試正則表達式使用這個工具:click
正則表達式的:Nettuts
命名後向引用:Click