我有下面给出的主机名,我想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
的主机名。
答案 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)
如果你有纸和笔,并且要求你写下一个简单的算法来做到这一点,你会怎么做?
我就是这样做的:
您可以通过查找第一个点来确定字符串中子域的位置。因此,找到第一个点,然后提取子域。
由于我们只对数字感兴趣,因此我们可以逻辑地删除任何不是数字的内容。
现在我们只有一个数字,评估它是否是我们想要的应该非常简单。
在代码中,您可以执行以下操作:
$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>";
}
}