2013-05-07 107 views
0

我有一個自定義標記解析函數,多年來一直運行良好。我最近發現了一個我以前沒有注意到的錯誤,但我無法修復它。如果任何人都可以幫助我,那真是太棒了。所以我有一個定製的論壇和基於文本的MMORPG,並且每一個輸入都會被清理並解析爲bbcode,比如標記。它還會解析出網址,並將其轉換爲合法鏈接,然後轉到退出網頁,並提供您要離開網站的免責聲明......所以我遇到的問題是,當我用戶在多個網址中發佈多個網址時文本框(假設\ n分隔),它只會將每個其他網址轉換爲鏈接。這裏是URL的解析器:PHP正則表達式URL解析問題preg_replace

$markup = preg_replace("/(^|[^=\"\/])\b((\w+:\/\/|www\.)[^\s<]+)" . "((\W+|\b)([\s<]|$))/ei", '"$1<a href=\"out.php?".shortURL("$2")."\" target=\"_blank\">".shortURL("$2")."</a>$4"', $markup); 

正如你可以看到它調用一個PHP函數,但這不是問題在這裏。然後將整個文本塊同時傳遞到此preg_replace,而不是逐行或任何其他方式。

  1. 如果有寫這個的preg_replace的一個更簡單的方法,請讓我知道
  2. 如果你能弄清楚這是爲什麼只解析每一個其他網址,這裏是我的終極目標

輸入例:

http://skylnk.co/tRRTnb 
http://skylnk.co/hkIJBT 
http://skylnk.co/vUMGQo 
http://skylnk.co/USOLfW 
http://skylnk.co/BPlaJl 
http://skylnk.co/tqcPbL 
http://skylnk.co/jJTjRs 
http://skylnk.co/itmhJs 
http://skylnk.co/llUBAR 
http://skylnk.co/XDJZxD 

例OUTPUT:

<a href="out.php?http://skylnk.co/tRRTnb" target="_blank">http://skylnk.co/tRRTnb</a> 
<br>http://skylnk.co/hkIJBT 
<br><a href="out.php?http://skylnk.co/vUMGQo" target="_blank">http://skylnk.co/vUMGQo</a> 
<br>http://skylnk.co/USOLfW 
<br><a href="out.php?http://skylnk.co/BPlaJl" target="_blank">http://skylnk.co/BPlaJl</a> 
<br>http://skylnk.co/tqcPbL 
<br><a href="out.php?http://skylnk.co/jJTjRs" target="_blank">http://skylnk.co/jJTjRs</a> 
<br>http://skylnk.co/itmhJs 
<br><a href="out.php?http://skylnk.co/llUBAR" target="_blank">http://skylnk.co/llUBAR</a> 
<br>http://skylnk.co/XDJZxD 
<br> 
+0

你能給一個失敗的測試用例嗎? – nhahtdh 2013-05-07 05:55:50

+0

我已經更新了帖子。 – 2013-05-08 03:54:17

回答

1

epreg_replace的標誌是deprecated。您可以使用preg_replace_callback來訪問相同的功能。

i這裏的標誌沒用,因爲\w已經匹配大寫和小寫,並且在你的模式中沒有反向引用。

我設置了m標誌,這使得^$匹配一行的開始和結束,而不是整個字符串的開始和結束。這應該解決你匹配其他每一行的奇怪問題。

我也讓一些組不捕獲(?:pattern) - 因爲更大的捕獲組已經捕獲了文本。

以下代碼未經測試。我只在正則表達式測試器上測試了正則表達式。

preg_replace_callback(
    "/(^|[^=\"\/])\b((?:\w+:\/\/|www\.)[^\s<]+)((?:\W+|\b)(?:[\s<]|$))/m", 
    function ($m) { 
     return "$m[1]<a href=\"out.php?".shortURL($m[2])."\" target=\"_blank\">".shortURL($m[2])."</a>$m[3]"; 
    }, 
    $markup 
); 
+0

哇,真棒。用正則表達式學習很多東西。感謝您的及時回覆,併爲我的延誤感到抱歉。 – 2013-05-08 05:01:21