2011-07-31 41 views
0

使用任意一組網址(例如:http://api.longurl.org/v2/services)將此列表轉換爲正則表達式的最佳方式是什麼?將一組網址轉換爲正則表達式(可選模式)

這是合適的正則表達式嗎?

(((easyuri|eepurl|eweri)\.com)|((migre|mke|myloc)\.me)|etc...)' 

你可以做多層次的可選模式嗎?

+1

的問題不在於正則表達式的樣子,而是一個很好的解決方案。你打算做什麼? –

+1

我想這可能是這種情況......我只是想啜飲xml(longurl api),把它變成一個正則表達式,並且匹配這個正則表達式的url。我只需要查看給定的url是否與該集合中的域/(/ sld)/ tld實體相匹配。 –

回答

0

我看到不同的方法來完成這個。

  1. 使用XPath並嘗試選擇給定當前URL的節點。
  2. 將xml解析爲字典並測試當前URL是否存在爲鍵。
  3. 將XML的域存儲在數據庫中,爲url字段建立索引並查詢當前的URL。
  4. 如果性能不是問題:將當前URL與整個XML文件匹配爲文本。
  5. 也許還有更多的想法。

建設從XML正則表達式似乎沒有給我一個好主意,因爲所有其他解決方案更容易發展在我看來。

+1

所有這些選項的問題在於,它們都需要用戶輸入網址上的初始正則表達式。我不得不希望我得到輸入url的正確部分,並匹配給定的集合(或者通過xpath,一個字典loolup像一個SQL選擇,等等)。我認爲從已知的集合中創建一個正則表達式,並與它相匹配的未知數更直接。這個正則表達式將被緩存並定期重新創建。 –

0

OP的回答是:

那麼事實證明,這樣做的工作:

/((?:easyuri|eepurl|eweri)\.com)|((?:migre|mke|myloc)\.me)/ 

運行鍼對這一點:

easyuri.com eepurl.comer eweri.us migre.me mke.memo myloc.em 

你得到這樣的:

[0] => Array 
    (
     [0] => easyuri.com 
     [1] => eepurl.com 
     [2] => migre.me 
     [3] => mke.me 
    ) 

但最簡單的方法只會是這樣的:

/0rz\.tw|1link\.in|1url\.com|2\.gp|2big\.at|etc\.\.\./ 

正則表達式的幫助可能比其他方法,你複雜的事情更多。 ,P

這裏是我最終用於創建正則表達式的PHP:

假定您已經cURL'd http://api.longurl.org/v2/services並轉換XML以數組名爲$urlShorteners,如:$urlShorteners = array('0rz.tw', '1link.in', 'etc...');

foreach($urlShorteners as $url) { 
    $urls[] = array_reverse(explode('.', $url)); 
} 

foreach($urls as $url) { 
    $tldKeys[array_shift($url)][] = $url; 
} 

foreach($tldKeys as $tld => $doms) { 
    if($tld != '') { 
     $subPattern = array(); 
     foreach($doms as $subDomain) { 
      $subPattern[] = implode("\.", array_reverse($subDomain)); 
     } 
     if (count($subPattern) > 1) $optionPattern[] = "((?:" . implode("|", $subPattern) . ")\." . $tld . ")"; 
     else $optionPattern[] = "(" . $subPattern[0] . "\." . $tld . ")"; 
    } 
} 
$regex = '/' . implode('|', $optionPattern) . '/'; 
echo $regex . "\n"; 
相關問題