使用任意一組網址(例如:http://api.longurl.org/v2/services)將此列表轉換爲正則表達式的最佳方式是什麼?將一組網址轉換爲正則表達式(可選模式)
這是合適的正則表達式嗎?
(((easyuri|eepurl|eweri)\.com)|((migre|mke|myloc)\.me)|etc...)'
你可以做多層次的可選模式嗎?
使用任意一組網址(例如:http://api.longurl.org/v2/services)將此列表轉換爲正則表達式的最佳方式是什麼?將一組網址轉換爲正則表達式(可選模式)
這是合適的正則表達式嗎?
(((easyuri|eepurl|eweri)\.com)|((migre|mke|myloc)\.me)|etc...)'
你可以做多層次的可選模式嗎?
我看到不同的方法來完成這個。
建設從XML正則表達式似乎沒有給我一個好主意,因爲所有其他解決方案更容易發展在我看來。
所有這些選項的問題在於,它們都需要用戶輸入網址上的初始正則表達式。我不得不希望我得到輸入url的正確部分,並匹配給定的集合(或者通過xpath,一個字典loolup像一個SQL選擇,等等)。我認爲從已知的集合中創建一個正則表達式,並與它相匹配的未知數更直接。這個正則表達式將被緩存並定期重新創建。 –
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";
的問題不在於正則表達式的樣子,而是一個很好的解決方案。你打算做什麼? –
我想這可能是這種情況......我只是想啜飲xml(longurl api),把它變成一個正則表達式,並且匹配這個正則表達式的url。我只需要查看給定的url是否與該集合中的域/(/ sld)/ tld實體相匹配。 –