如何确保域名与这3个简单标准相匹配:
不得以
开头我已经设法理解了与第一个标准相对应的正则表达式的这一部分:
/.*(\.com|\.net)$/
但我不知道如何实现另外两个条件来制作一个独特的正则表达式。
感谢您的帮助。
答案 0 :(得分:4)
最明智的做法是两个独立的正则表达式,一个匹配你想要的,一个不匹配你不想要的。
但你可以在一个负面预测中执行此操作:
/^(?!https?:\/\/(www\.)?).*(\.com|\.net)$/
编辑:更正由ridgerunner
指出的断言答案 1 :(得分:2)
如果您需要确保字符串不包含前两个点,为什么不简单地使用str_replace然后测试第一个标准?我认为这将更容易,也更有效率。
答案 2 :(得分:2)
正则表达式解决方案很简单。简单地在字符串的开头处断言负向前瞻,如下所示:(带注释......)
if (preg_match('%
# Match non-http ,com or .net domain.
^ # Anchor to start of string.
(?! # Assert that this URL is NOT...
https?:// # HTTP or HTTPS scheme with
(?:www\.)? # optional www. subdomain.
) # End negative lookahead.
.* # Match up to TLD.
\. # Last literal dot before TLD.
(?: # Group for TLD alternatives.
net # Either .net
| com # or .com.
) # End group of TLD alts.
$ # Anchor to end of string.
%xi', $text)) {
// It matches.
} else {
// It doesn't match.
}
请注意,由于:http://www.
是http://
的子集,因此无需使用可选www.
的表达式。这是一个较短的版本:
if (preg_match('%^(?!https?://).*\.(?:net|com)$%i', $text)) {
// It matches.
} else {
// It doesn't match.
}
简单的正则表达救援!
答案 3 :(得分:0)
^[a-zA-Z\.]+\.(com|net)$
这有用吗?
如果我理解你正确,你想检查一个字符串列表,并找出哪些是域名。 e.g。
http://www.a.b (F)
a.com (T)
b.net (T)
https://google.com (F)
答案 4 :(得分:0)
试试这个:
if(preg_match('/^(?:http://|https://)(?:[w]{3}|)/i', $subject))
{
echo 'Fail';
}
else
{
if(preg_match('/(?:.*(\.com|\.net))$/i', $subject))
{
echo 'Pass';
}
else
{
echo 'Fail';
}
}