2009-11-25 47 views
0

我從db中收到一段代碼,偶爾會包含url,例如,http://site.tld/lorem.ipsum/whatever 現在我想用輔助方法將它變成用戶的良好可點擊鏈接。如:內容URL正則表達式

<a href="http://site.tld/lorem.ipsum/whatever">http://site.tld/lorem.ipsum/whatever</a> 

當然,任何人都可以做到這一點,[^\s]+是訣竅。但是顯而易見的問題是,如果我有一個點(。),例如在URL後面,我不希望它包含在鏈接中。因此,我們需要將URL限制爲多個字符,但是我們不能創建一個匹配不是特定字符的字符的規則,因爲前面提到的點是「url終止符」,但它也可以是包含在URL中。 我的第一個猜測這是什麼:

(http\:\/\/[^\s]+)(\,|\.|\;|\:)? 

這將被替換爲

<a href="$1">$1</a>$2 

但它不工作,因爲第二個變量容器是可選的,它似乎是最好的這些字符是包括在第一個中,因爲除了空格字符之外,任何東西都是允許的。

我真的很感謝你的幫助,但老實說,我不想在互聯網上找到一個巨大的規則,這似乎在目前工作。我確信有一個很酷的方式來獲得這個。我對正則表達式有一個體面的理解,但這種情況似乎是我以前沒有經歷過的。或者,也許我錯過了一些東西,畢竟它已經過了凌晨3點。

謝謝!

編輯:

@Chirael清除它爲我,但這裏是我最終的解決方案:

(http\:\/\/[^\s]+?)(\,|\.|\;|\:)?(\s|$) 
  1. 我,因爲我使用PHP
  2. 我清除斜槓在第二個變量中添加了更多字符作爲「URL停止符」
  3. 由於第一個變量變爲「非貪婪」,而第二個變量是可選的,所以如果未指定第三個變量,在「http://」後面加上第一個字符。但是當URL是文本中的最後一個東西時出現問題,所以現在第三個變量可以是空格字符或文本的結尾。

回答

2

打滑,加?在[^ \ s] +之後使其非貪婪,然後是一個「可選」期間? - 我用下面的示例文本文件中的:

Lorem I receive a block of code from db which occasionally contains 
urls, e.g, http://site.tld/lorem.ipsum/whatever and 
http://site.tld/lorem.ipsum/whatevertwo. Now I want to turn this into 
nice clickable link for the user, with a helper method. Such as. 

,然後運行命令行下面的代碼,它似乎滿足您的要求:

perl -pe 's#(http://[^\s]+?)(\.?)(\s)#<a href="$1">$1</a>$2$3#g' foo.txt 

...導致:

Lorem I receive a block of code from db which occasionally contains 
urls, e.g, <a href="http://site.tld/lorem.ipsum/whatever">http://site.tld/lorem.ipsum/whatever</a> and 
<a href="http://site.tld/lorem.ipsum/whatevertwo">http://site.tld/lorem.ipsum/whatevertwo</a>. Now I want to turn this into 
nice clickable link for the user, with a helper method. Such as. 

這是否行得通?

+0

輝煌!我知道必須有這樣的概念。當你說「讓它不貪婪」時,我的心就在增長。那正是我所期待的。我記得以前我用過這個,但現在我覺得我的啓發不大。你知道我在哪裏可以找到關於這個想法的東西,以確保我100%知道它的工作原理嗎?再次感謝! – treznik 2009-11-25 01:57:57

+0

太棒了 - 如果這回答了您的問題,您是否介意點擊複選標記以「接受」它?我是新的網站,並已被吸引到這整個「信譽評分」的事情;)(謝謝:) – Chirael 2009-11-25 01:59:00

+0

哦,至於貪婪或非貪婪的想法,我沒有一個規範的來源,在20世紀90年代中期,我學習了有關正則表達式的知識,當時Perl是該語言,CGI是該做的事情(早在Perl 4的鼎盛時期)。所以我能推薦的唯一東西是「man perlre」,儘管我相信O'reilly有一本關於正則表達式的書,可能值得瀏覽。 – Chirael 2009-11-25 02:00:13

0

你可以試試這個:

正則表達式:

(http?://([-\w\.]+)+(:\d+)?(/([\w/_\.]*(\?\S+)?)?)?) 

更換:

<a href="$1">$1</a> 
+0

謝謝。 我正在使用PHP,其中規則是用斜線包裝,例如'/(.*)/'。 所以你的規則當前會觸發一個錯誤(Unknown modifier'/')。我嘗試從規則中跳出所有包含的斜線,但結果與我的一樣,點包含在URL中。但是,它會正確排除其中一個網址的逗號。 – treznik 2009-11-25 01:51:22

+0

你在那裏打滑,「 - 」字符也可能打破這個規則。 – jerjer 2009-11-25 09:47:06

1

你也可以嘗試一種不同的方法:你可以指定什麼可以接受爲最後一個字符,而不是列出你想要包含在URL末尾的不是。在這個例子中:

$str = preg_replace('#(http://\S+[a-z0-9/])#', '<a href="\1">\1</a>', $str); 

我所要求的非空間的序列,並在最後一個字母數字字符(加斜槓)(這通常是有效的URL如何結束)。

有兩點要注意也:

    在PHP
  • (如在Perl),你可以選擇你的模式分隔符,/ /僅僅是傳統的,但你可以選擇(幾乎)任何你喜歡的字符:選擇正確的分隔符避免了大量逸出
  • 交替的單個字符的比較好寫爲一個字符類:[,.;:]更容易比(\,|\.|\;|\:)其中還包括不必要的逃逸(只點需要它)
  • 學習需要轉義和讀什麼書什麼不是,填補你的與反斜槓模式將使其不可讀
+0

當我有更多的時間時,我將不得不修改這個,但你的方法看起來很完美,但似乎很明顯,我不能相信它沒有超出我的想法。 另外,關於模式分隔符,我可以如何挑選它?只要將它作爲第一個字符自動將它分配爲分隔符? 我想我從來沒有掌握何時使用括號(除了當需要一個變量容器,或特定的字符類,如a-z,0-9等),以及使用哪種類型。 你說的是逃避,看起來很醜,但我注意到它有時取決於語言,所以我的想法很安全。謝謝! – treznik 2009-11-28 00:24:09

+0

是的,模式中的第一個字符變成了分隔符,並且您必須在最後匹配它。您也可以使用各種括號,在這種情況下,您可以將它們「自然」匹配,而不是重複第一個字符:'(..pattern ..)','{..pattern ..}'等等。 – 2009-11-28 00:34:54