使用任意一组网址(例如:http://api.longurl.org/v2/services)将此列表转换为正则表达式的最佳方法是什么?
这是正确的正则表达式吗?
(((easyuri|eepurl|eweri)\.com)|((migre|mke|myloc)\.me)|etc...)'
你可以做多级别的可选模式吗?
答案 0 :(得分:0)
我看到了不同的方法来实现这一目标。
从XML构建正则表达式似乎不是一个好主意,因为在我看来,所有其他解决方案都更容易开发。
答案 1 :(得分:0)
OP'S答案:
事实证明这确实有效:
/((?: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 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";