2013-01-16 45 views
1

我有HTML /文本字符串,並希望匹配文本的所有鏈接類似的部分真正的超鏈接與A標記。對於這個問題,我試圖匹配「www.somesite.domen」模式。但是,如果模式在句子結尾處接近標點符號,該怎麼辦?正則表達式鏈接式匹配沒有最後的坦途字符

如何匹配沒有最後一個字符的圖案是標點符號?

  1. www.somesite.domen。
  2. www.somesite.domen,
  3. www.somesite.domen?
  4. www.somesite.domen!
  5. www.somesite.domen /?id = 1?

下面是一個使用該函數我':

function make_links($text) 
{ 
    return preg_replace(
    array(
     '/(^|\s)(www\.[^<>\s!,]+)(!$|\s|\.|\:|\!|,|\?)/iex' 
     ), 
    array(
     "stripslashes((strlen('\\2')>0?'\\1<a target=\"_blank\" href=\"http://\\2\">\\2</a>\\3':'\\0'))" 
     ), 
     $text 
    ); 
} 

但是,當 ''要麼 '?'字符是句子中的最後一個,我的功能也將它們帶入鏈接。

任何想法如何解決這種情況?謝謝!

+0

你的文本是否包含'[]'來分隔域名? – nhahtdh

+0

我的文字不包含'[]'。 – Branislav

+0

參見http://stackoverflow.com/questions/206059/php-validation-regex-for-url –

回答

0

如果我正確地理解您的需求,您需要打破你的文本行分爲3組

  • 第一組將保留文本之前主機名
  • 第二組將保持主機名稱
  • 第三組將持續標點符號(或空白字符)。

一種解決方案可以爲如下:

/^(.*?)(www(?:.\w+)+(?:\/[^.\s]+?))(!$|\s|\.|\:|\!|,|\?)?$/ 

Regexp explained

使用some text www.host.some-site.domen/?id=1?,你會得到匹配作爲示例如下:

Matching results

爲了擺弄你的正則表達式,你可以使用regex101.com

EDIT

可選地,這是另一個正則表達式。

/^(.+\s)?(\w+(?:\.[-\w]+)+\.\w+(?:\/.*?)?)(!$|\s|\.|\:|\!|,|\?)?$/ 

我已經進行多次試驗:

  • 測試文字:some stuff www.host.somesite.domen/?id=1.。匹配組:

    • 1:some stuff
    • 2:www.host.somesite.domen/?id=1
    • 3:.
  • 測試文字:some stuff www.host.somesite.domain.。匹配組:

    • 1:some stuff
    • 2:www.host.somesite.domen
    • 3:.
  • 測試文字:www.host.somesite.domain。匹配的組(只有一個):

    • 2:www.host.somesite.domain
  • 測試文字:hello www.host.somesite.domen/mysite.。匹配組:

    • 1:hello
    • 2:www.host.somesite.domen/mysite
    • 3:.
  • 測試文字:www.somesite.domen/?id=1?。匹配組:

    • 2:www.somesite.domen/?id=1
    • 3:?

我希望這將有助於解決您的問題。

+0

對不起,'[]'不是文本的一部分。我剛剛從案件中刪除了他們。 – Branislav

+0

@Branislav,主機名是什麼,它總是www? – Tom

+0

在這個問題中,鏈接就像www一樣隨時啓動。所以我必須匹配更多的案例,因爲我可以,但最終沒有標點符號。主持人也歡迎。你知道''。和'?'可以在URL中,但不在最後。例如:「這是我的網站URL www.hostname.com/mysite。」 – Branislav