2014-02-18 16 views
-2

我有以下给出的主机名,我想preg_match特定模式。PHP preg_match主机名中的特定模式

主机名:

sub1.hostname1.com 
sub12.hostname2.com 
suboo2.hostname3.com 
sub2.hostname4.com 

所需的输出的preg_match后:

sub1.hostname1.com 
suboo2.hostname3.com 
sub2.hostname4.com 

的想法是让有子域中的一个12主机名。

+0

你有试过什么吗?如果是的话,把你的代码 –

+0

不,我没有挣扎。我得到了一个基于sed的正则表达式匹配,但不适用于php。 – basic1point0

+0

对于数组,请尝试'preg_grep'。 – AbraCadaver

回答

-1

如果你有一张纸,一支笔,你被要求写下一个简单的算法,这样做,你会怎么做呢?

这是我会怎么做:

  1. 您可以确定子域,在字符串中,通过查找第一个点。因此,找到第一个点,然后提取子域。

  2. 由于我们只关心我们可以在逻辑上的数字,删除任何不是数字的东西。

  3. 现在我们只有一个数字,它应该很简单,以评估它是否是我们想要的。

在代码中,你可以做这样的事情:

$samples = [ 
    'sub1.hostname1.com', 
    'sub12.hostname2.com', 
    'suboo2.hostname3.com', 
    'sub2.hostname4.com', 
]; 
foreach ($samples as $domain) { 

    // Find the sub-domain 
    $dot = strpos($domain, '.'); 
    if ($dot === false) { 
     continue; 
    } 
    $sub = substr($domain, 0, $dot); 

    // Remove non-numbers from the sub-domain 
    $number = filter_var($sub, FILTER_SANITIZE_NUMBER_INT); 

    // Check that it is what we want 
    if ($number == 1 or $number == 2) { 
     echo "$domain is a $number sub-domain<br>"; 
    } 
} 

我会离开它作为一个练习扔东西到一个函数,如果这是你在找什么。

如果你绝对要使用正则表达式的话,那就只是检查数子域名的问题:

foreach ($samples as $domain) { 
    $matches = preg_match('/^[^0-9]+(?:1|2)\./', $domain); 
    if ($matches === 1) { 
     echo "$domain is a 1 or 2 sub-domain<br>"; 
    } 
} 
+0

你是一个摇滚明星!谢啦。 – basic1point0

+0

您的正则表达式不适用于以**开头的子域。事实上,它只适用于以** 1或2结尾的那些。 – Phil

+0

@我知道。我根据问题中给出的例子回答了我的答案;他们只用数字结尾*。如果提问者想要匹配更复杂的模式,那么他们需要更彻底地解释它。 –

0

听起来更像你想过滤器阵列。试试这个...

$filtered = array_filter($hostnames, function($hostname) { 
    // assume that the "subdomain" is the first hostname segment, separated by "." 
    list($subdomain, $theRest) = explode('.', $hostname, 2); 

    return preg_match_all('/1|2/', $subdomain) === 1; 
}); 

演示在这里 - http://ideone.com/MwbS7T

0

你的问题是相当不明确,但是从意见我可以提取的含义如下:

匹配的子域,其包含恰好一个“1”或恰好一个“2”,但不能同时

这一要求转化为以下代码:

$subdom = strstr($host, '.', true); 

$matched = substr_count($subdom, '1') == 1^substr_count($subdom, '2') == 1; 

^(XOR)操作者可确保与两个“1”和“2”的子域不计算在内。