PHP preg_match主机名中的特定模式

时间:2014-02-18 02:29:36

标签: php arrays preg-match

我有下面给出的主机名,我想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

我们的想法是让子域名中包含 1 2 的主机名。

3 个答案:

答案 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

答案 1 :(得分:0)

您的问题尚不清楚,但从评论中我可以提取以下含义:

  

匹配包含一个' 1'的子域名。或者只是一个' 2',但不是两个

该要求转换为此代码:

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

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

^(xor)运算符可确保包含' 1'的子域和' 2'不计算在内。

答案 2 :(得分:-1)

如果你有纸和笔,并且要求你写下一个简单的算法来做到这一点,你会怎么做?

我就是这样做的:

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

  2. 由于我们只对数字感兴趣,因此我们可以逻辑地删除任何不是数字的内容。

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

  4. 在代码中,您可以执行以下操作:

    $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>";
        }
    }