我已经实现了验证.edu域的功能。我就是这样做的:
if( preg_match('/edu/', $matches[0])==FALSE )
return FALSE;
return TRUE;
现在我想跳过那些指向某些文档的网址,例如.pdf和.doc。
为此,以下代码应该有效但不是:
if( preg_match('/edu/', $matches[0])==FALSE || preg_match('/pdf/i', $matches[0])!=FALSE || preg_match('/doc/i', $matches[0]!=FALSE))
return FALSE;
return TRUE;
在这方面我哪里错了? 此外,我将如何实现preg_match,使其具有要在url字符串中检查的文档类型列表。如果找到某种类型的文档,则应返回false。换句话说,我想提供一个列表(可能是一个数组)的各种文档类型作为$ pattern在网址中查找。
注意: matches [0]包含整个url字符串。 例如:http://www.nust.edu.pk/Documents/pdf/NNBS_Form.pdf
该功能的代码:
public function validateEduDomain($url) {
// get host name from URL
preg_match('@^(?:http://)?([^/]+)@i', $url, $matches);
$host = $matches[1];
// get last two segments of host name
preg_match('/[^.]+\.[^.]+$/', $host, $matches);
if( preg_match('/edu/', $matches[0])!=FALSE && (preg_match('/pdf/i', $matches[0])==FALSE || preg_match('/doc/i', $matches[0]==FALSE)))
return TRUE;
return FALSE;
}
答案 0 :(得分:2)
我想知道你为什么要把一切变得如此复杂,并且还注意到你有$$匹配[0]而不是$ matches [0]。你想要的正则表达式是:
if( preg_match('/^https?:\/\/[A-Za-z]+[A-Za-z0-9\.-]+\.edu/i', $matches[0]) && !preg_match('/\.(pdf)|(doc)$/i', $matches[0]) ) {
// do something here...
}
答案 1 :(得分:1)
您可以查看文件扩展名是否与以下内容匹配:
preg_match('/\.php$/i', $string);
另外,为什么你在$ matches [0]的第二和第三次使用中使用双美元符号?
答案 2 :(得分:1)
如果我理解正确,这样的事情会有所帮助:http://ideone.com/XOEiU
function validate_path($url) {
$url_parts = parse_url($url);
$path_info = pathinfo($url_parts['path']);
return preg_match('/\\.edu(?:\\.|$)/', $url_parts['host']) && in_array($path_info['extension'], array('pdf', 'doc', 'docx'));
}
答案 3 :(得分:1)
我不会使用正则表达式:
function is_edu_domain($url)
{
$parsed = parse_url($url);
$parts = explode('.', $parsed['host']);
return in_array('edu', $parts, TRUE);
}
这与您在评论中指定的域名相匹配。
对于文件扩展名,我会有一个更容易维护的单独函数:
function is_unwanted_file_extension($url)
{
$path = pathinfo($url);
$extension = strtolower($path['extension']);
$unwanted_extensions = explode(',', 'pdf,doc');
return in_array($extension, $unwanted_extensions, TRUE);
}
你可以将两者结合起来:
function is_url_from_edu_and_wanted($url)
{
return is_edu_domain($url) and !is_unwanted_file_extension($url);
}
比正则表达式更具可读性和可维护性,但请注意我已经针对这些事情进行了优化而不是速度。