将一组网址转换为正则表达式模式(可选模式)

时间:2011-07-31 20:02:28

标签: regex

使用任意一组网址(例如:http://api.longurl.org/v2/services)将此列表转换为正则表达式的最佳方法是什么?

这是正确的正则表达式吗?

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

你可以做多级别的可选模式吗?

2 个答案:

答案 0 :(得分:0)

我看到了不同的方法来实现这一目标。

  1. 使用XPath并尝试选择给定当前URL的节点。
  2. 将xml解析为字典并测试当前URL(如果它作为键存在)。
  3. 将XML的域存储在数据库中,索引url字段并查询当前的URL。
  4. 如果性能不是问题:将当前URL与整个XML文件匹配为文本。
  5. 也许还有更多的想法。
  6. 从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";