正则表达式单元测试通过,但实际尝试使用时似乎无法正常工作。
正则表达式单元测试通过,但实际尝试使用时似乎无法正常工作。
这是一个链接到linter中的字符串。\n这是表达式本身:\n我试图使用这个表达式验证几乎所有的网址。\n我们可以看到它按预期通过了单元测试:\n然而,正如我所说,当我尝试运行我的代码时,它似乎忽略了验证...让我很困惑。\n这是代码的相关部分:\n//从这里友好地借用:http://stackoverflow.com/a/34589895/2226328\nfunction checkPageSpeed($url){\n if (function_exists(\'file_get_contents\')) {\n $result = @file_get_contents($url);\n }\n if ($result == \'\') {\n $ch = curl_init();\n $timeout = 60;\n curl_setopt($ch, CURLOPT_URL, $url);\n curl_setopt($ch, CURLOPT_HEADER,1);//获取头信息\n curl_setopt($ch, CURLOPT_NOBODY,1);//只获取头信息\n curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);//将响应作为字符串从curl_exec()中获取,而不是直接输出\n curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);\n curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0);\n curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0);\n curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, $timeout);\n curl_setopt($ch, CURLOPT_FRESH_CONNECT,1);//不使用缓存的url版本\n $result = curl_exec($ch);\n curl_close($ch);\n }\n return $result;\n}\nfunction pingGoogle($url){\n echo \"
\".$url.\"
\";\n if(strtolower(substr($url, 0, 4)) !== \"http\") {\n echo \"为$url添加http://
\";\n $url = \"http://\".$url;\n echo \"URL现在是$url
\";\n }\n //来源:https://gist.github.com/dperini/729294\n $re = \"/(?i)\\\\b((?:https?:\\\\/\\\\/|www\\\\d{0,3}[.]|[a-z0-9.\\\\-]+[.][a-z]{2,4}\\\\/)(?:[^\\\\s()<>]+|\\\\(([^\\\\s()<>]+|(\\\\([^\\\\s()<>]+\\\\)))*\\\\))+(?:\\\\(([^\\\\s()<>]+|(\\\\([^\\\\s()<>]+\\\\)))*\\\\)|[^\\\\s`!()\\\\[\\\\]{};:\'\\\\\\\".,<>?«»“”‘’]))/\";\n $test = preg_match($re, $url);\n var_export($test);\n if( $test === 1) {\n echo \"$url通过模式测试...让我们检查它是否真的有效...\";\n pingGoogle(\"hjm.google.cm/\");\n pingGoogle(\"gamefaqs.com\");\n }\n else\n {\n echo \"URL格式正确,但不是一个有效的URL!
\";\n }\n}
这个问题的原因可能是因为使用了错误的正则表达式或者正则表达式的使用方式有问题。解决方法可以是尝试使用PHP的内置验证过滤器FILTER_VALIDATE_URL
以及filter_var()
函数来进行验证。这种方法比起自己编写基于正则表达式的解决方案,不仅可以简化代码,还可以提高性能。
以下是一个示例代码,演示如何使用FILTER_VALIDATE_URL
和filter_var()
来验证URL:
$url = "http://example.com"; if (filter_var($url, FILTER_VALIDATE_URL)) { echo "URL is valid"; } else { echo "URL is not valid"; }
上述代码将输出"URL is valid",如果URL不符合验证规则,则会输出"URL is not valid"。
使用FILTER_VALIDATE_URL
过滤器可以确保URL符合标准的URL格式,而不需要自己编写复杂的正则表达式。这不仅能简化代码,还能减少出错的可能性。
更多关于FILTER_VALIDATE_URL
和filter_var()
函数的详细信息可以参考PHP官方文档:
问题出现的原因是,虽然正则表达式单元测试通过了,但在实际使用时似乎并不能正常工作。解决方法是考虑使用`parse_url`函数来让PHP为我们进行处理。由于只需要获取域名,可以尝试以下代码:
$host = parse_url($url, PHP_URL_HOST); if ($host === null) { echo "Failed to parse, no host found"; } else { // 在这里处理获取到的域名 }
另外,对于给出的正则表达式`@((https?://)?([-\w]+\.[-\w\.]+)+\w(:\d+)?(/([-\w/_\.]*(\?\S+)?)?)*)@`,我认为它能够工作。因为即使在解析之后再进行测试,只要URL看起来像一个URL,那么它就会失败,如果无法连接的话。顺便说一句,这个正则表达式确实非常复杂。如果你想要更复杂的正则表达式,可以参考这个链接:gist.githubusercontent.com/dperini/729294/raw/…。
我看到你提到的“正则表达式和其他一些内容”,我就给你展示一个更复杂的正则表达式,参考RFC822中的正则表达式。