检查字符串是不是为 URL [重复]
Posted
技术标签:
【中文标题】检查字符串是不是为 URL [重复]【英文标题】:check if a string is a URL [duplicate]检查字符串是否为 URL [重复] 【发布时间】:2012-03-26 06:02:24 【问题描述】:我看过很多问题,但无法理解它是如何工作的 因为我想要一个更简单的案例。
如果我们有文本,不管它是什么,我想检查它是否是一个 URL。
$text = "something.com"; //this is a url
if (!IsUrl($text))
echo "No it is not url";
exit; // die well
else
echo "Yes it is url";
// my else codes goes
function IsUrl($url)
// ???
在JS被阻塞的情况下,除了用javascript检查之外,还有其他方法吗?
【问题讨论】:
【参考方案1】:下面的代码对我有用:
if(filter_var($text, FILTER_VALIDATE_URL))
echo "Yes it is url";
exit; // die well
else
echo "No it is not url";
// my else codes goes
您还可以使用标志在 URL 上指定RFC 合规性和其他要求。详情请见php Validate Filters。
【讨论】:
您的第一行应该检查是否为假,因此实际上是if(!filter_var($text, FILTER_VALIDATE_URL))
或翻转您的 if/else。
谢谢嘉莉,回声信息确实被翻转了。我已经修好了。
如果有人尝试使用example.com,它只会覆盖完整的URL,如example.com,它不会检测到。【参考方案2】:
PHP 的filter_var
函数正是您所需要的。寻找FILTER_VALIDATE_URL
。您还可以设置 flags
来微调您的实现。
不需要正则表达式....
【讨论】:
但是,只有在 URL 前使用http
时才适用。例如,www.google.com 将无法正确验证。
从技术上讲,根据 URL(或 URI)的定义,它需要一个协议(http、https 等)作为字符串中的第一件事。您所描述的只是完整 URL 的域和路径部分。
www.google.com 我认为这不是一个完整的网址。但是如果你想要一个聪明的方法。使用正则表达式。【参考方案3】:
http://www.php.net/manual/en/function.preg-match.php#93824
<?php
$regex = "((https?|ftp)\:\/\/)?"; // SCHEME
$regex .= "([a-z0-9+!*(),;?&=\$_.-]+(\:[a-z0-9+!*(),;?&=\$_.-]+)?@)?"; // User and Pass
$regex .= "([a-z0-9-.]*)\.([a-z]2,3)"; // Host or IP
$regex .= "(\:[0-9]2,5)?"; // Port
$regex .= "(\/([a-z0-9+\$_-]\.?)+)*\/?"; // Path
$regex .= "(\?[a-z+&\$_.-][a-z0-9;:@&%=+\/\$_.-]*)?"; // GET Query
$regex .= "(#[a-z_.-][a-z0-9+\$_.-]*)?"; // Anchor
if(preg_match("/^$regex$/i", $url)) // `i` flag for case-insensitive
return true;
?>
但您的示例 URL 过于简化,(\w+)\.(\w+)
会匹配它。其他人提到了filter_var
,它只是一个filter_var($url, FILTER_VALIDATE_URL)
,但它是doesn't seem to like non-ascii 字符,所以请注意...
【讨论】:
我建议查看 GET 查询。没有解析 youtube 链接。我需要进行一些更改以使它们基于:***.com/questions/23959352/…【参考方案4】:检查它是否是一个有效的网址(example.com 不是一个有效的网址)
function isValidURL($url)
return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*
(:[0-9]+)?(/.*)?$|i', $url);
如何使用该功能:
if(!isValidURL($fldbanner_url))
$errMsg .= "* Please enter valid URL including http://<br>";
来源:http://phpcentral.com/208-url-validation-in-php.html
【讨论】:
ftp://【参考方案5】:正则表达式是验证 URL 等复杂内容的糟糕方法。
PHP 的filter_var() 函数提供了一种更可靠的方法来验证 URL。此外,它更快,因为它是本机代码。
【讨论】:
嗯?这个问题与 ASP.net 或 C# 无关。它专门询问如何在 PHP 中验证 URL。 如果你看上面,原来的问题没有提到任何关于 PHP 的内容。如果有的话,它是在询问如何在不使用 JS 的情况下实现结果。因此,实际上,您的答案不适合所提出的问题。此外,对于非 PHP 问题,Jack 批准的答案不应该被打上绿色勾号,因为它是 PHP 答案。另一个 IMO 节制不佳的例子。 问题被标记为“php”。提供的示例代码是 PHP。提问者可能应该更明确地提出他的问题 - 但从上下文中可以清楚地看出他正在尝试验证 URL 服务器端,并且使用 PHP 作为他的服务器端语言。我现在已经完成了这个愚蠢的论点:)【参考方案6】:我认为对此没有明确的答案。有效网址示例:
localhost
http://xxx.xxx.xxx/alkjnsdf
abs.com
如果你有一些文字。而且不是很多。您可以通过执行 CURL 请求来检查它是否返回有效响应。否则,如果我放 localhost,它可能是一个链接,也可能是其他东西,您将无法检查它。
【讨论】:
是的,我不在乎它是否有效,我只是想确保它不像 $text = "something blah blah blah"; 尝试其他人发布的一些解决方案,但仅仅因为它通过了正则表达式并不意味着它是一个有效的网址,例如a.com/a 丘克一针见血。您对“有效 URL”的要求太低了,无法提供答案。听起来您只是想确保输入看起来可能是 URL 或主机名。如果是这种情况,你唯一能做的就是确保它不包含任何空格。【参考方案7】:您可以使用以下正则表达式模式来检查您的变量是否为 url:
$pattern = "\b(([\w-]+:\/\/?|www[.])[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|\/)))";
【讨论】:
此代码不起作用 编辑了答案【参考方案8】:类似的东西可能对你有用:
$arr = array('abc.com/foo',
'localhost',
'abc+def',
'how r u',
'https://how r u',
'ftp://abc.com',
'a.b');
foreach ($arr as $u)
$url = $u;
if (!preg_match('#^(?:https?|ftp)://#', $url, $m))
$url = 'http://' . $url;
echo "$u => ";
var_dump(filter_var($url, FILTER_VALIDATE_URL));
输出:
abc.com/foo => string(18) "http://abc.com/foo"
localhost => string(16) "http://localhost"
abc+def => string(14) "http://abc+def"
how r u => bool(false)
https://how r u => bool(false)
ftp://abc.com => string(13) "ftp://abc.com"
a.b => string(10) "http://a.b"
所以基本上无论你注意到false
作为返回值,它对你来说都是一个无效的 URL。
【讨论】:
以上是关于检查字符串是不是为 URL [重复]的主要内容,如果未能解决你的问题,请参考以下文章