正则表达式修剪网址中的子域名

时间:2014-01-08 08:38:17

标签: php regex preg-match preg-match-all

我有一个与以下内容匹配的正则表达式:wiseman.google.com.jp,me.co.uk,paradise.museum,abcd-abc.net,www.google.jp,12345-daswe-23dswe-dswedsswe -54eddss.info,del.icio.us,jo.ggi.ng,所有这些都来自textarea值。

使用regexp(在preg_match_all($ regex1,$ str,$ match)中)获取上述值:
/(?:[a-zA-Z0-9]{2,}\.)?[-a-zA-Z0-9]{2,}\.[a-zA-Z0-9]{2,7}(?:\.[-a-zA-Z0-9]{2,3})?/

现在,我的问题是:如何让regexp将“wiseman.google.com.jp”修改为“google.com.jp”,将“www.google.jp”修改为“google.jp” ?

我正在制作第二个preg_match($ regex2,$ str,$ match)函数,每个值都来自preg_match_all函数。

我在$ regex2中尝试了这个正则表达式:([-a-zA-Z0-9\x{0080}-\x{00FF}]{2,}+)\.[a-zA-Z0-9\x{0080}-\x{00FF}]{2,7}(?:\.[-a-zA-Z0-9\x{0080}-\x{00FF}]{2,3})?
但是它不起作用。

任何输入? TIA

这是我的小解决方案:

preg_match_all($regex, $str, $matches, PREG_PATTERN_ORDER);
$arrlength=count($matches[0]);
for($x=0;$x<$arrlength;$x++){
    $dom = $matches[0][$x];
    $newstringcount = substr_count($dom, '.');   // this line is to count how many "." present in the string.
    if($newstringcount == 3){                       // if there are 3 '.' present in the string = true
        $pos = strpos($dom, '.', 0);              // this line is to find the first occurence of the '.' in the string
        $find = substr($dom, $pos+1);            //this line is to get the value after the first occurence of the '.' in the string
        echo $find;
    }else if($newstringcount == 2){
        if ($pos = strpos($dom,'www.') !== false) {
            $find = substr($dom, $pos+3);
            echo $find;
        }else{
            echo $dom;
        }
    }else if($newstringcount == 1){
        echo $dom;
    }
    echo "<br>";
}

1 个答案:

答案 0 :(得分:1)

(注意:如果您必须使用正则表达式,或者您有点......绝望......,此答案将仅满足您的需求。)

由于.com.jp.co.uk等域名,您无法通过常规规则实现目标。
人们可以找到的唯一一般规则是:

  

从右到左阅读时,有一个或两个TLD,后跟一个二级域

因此,我们必须将所有可用的TLD列入白名单。我想我会称之为“ domain-kraken 释放海妖!

([a-z0-9\-]{2,63}(?:\.(?:a(?:cademy|ero|rpa|sia|[cdefgilmnoqrstuwxz])|b(?:ike
|iz|uilders|uzz|[abdefghijlmnoqrstvwyz])|c(?:ab|amera|amp|areers|at|enter|eo
|lothing|odes|offee|om(?:pany|puter)?|onstruction|ontractors|oop|
[acdfghiklmnoruvwxyz])|d(?:iamonds|irectory|omains|[ejkmoz])|e(?:du(?:cation)?
|mail|nterprises|quipment|state|[ceghrstu])|f(?:arm|lorist|[ijkmor])|g(?:allery|
lass|raphics|uru|[abdefghlmnpqrstuwy])|h(?:ol(?:dings|iday)|ouse|[kmnrtu])|
i(?:mmobilien|n(?:fo|stitute|ternational)|[delmnoqrst])|j(?:obs|[emop])|
k(?:aufen|i(?:tchen|wi)|[eghimnprwxyz])|l(?:and|i(?:ghting|mo)|[abcikrstuvy])|
m(?:anagement|enu|il|obi|useum|[acdefghklmnopqrstuvwxyz])|n(?:ame|et|inja|
[acefgilopruz])|o(?:m|nl|rg)|p(?:hoto(?:graphy|s)|lumbing|ost|ro|[aefghklmnrstwy])|
r(?:e(?:cipes|pair)|uhr|[eosuw])|s(?:exy|hoes|ingles|ol(?:ar|utions)|upport|
ystems|[abcdeghijklmnorstuvxyz])|t(?:attoo|echnology|el|ips|oday|
[cdfghjklmnoprtvwz])|u(?:no|[agkmsyz])|v(?:entures|iajes|oyage|[aceginu])|
w(?:ang|ien|[fs])|xxx|y(?:[et])|z(?:[amw]))){1,2})$

将其与im标志一起使用。 这假设您的数据在多行上。

如果您的数据由,分隔,请将正则表达式中的最后一个字符($)更改为,?并使用g和{{1} } flags。

regex101debuggex提供了演示 (两个演示都有一个解释:regex101用文本描述它,而debuggex可视化野兽)

可在iana.org找到可用顶级域名列表,正则表达式中使用的顶级域名截至2014年1月。