使用 preg_match 检测 url?字符串中没有 http://
Posted
技术标签:
【中文标题】使用 preg_match 检测 url?字符串中没有 http://【英文标题】:Detecting a url using preg_match? without http:// in the string 【发布时间】:2011-02-15 06:38:54 【问题描述】:我想知道如何根据 preg_match 检查分解为数组的字符串以查看它是否以 www 开头。我已经有一个可以检查http://www。
function isValidURL($url)
return preg_match('|^http(s)?://[a-z0-9-]+(.[a-z0-9-]+)*(:[0-9]+)?(/.*)?$|i', $url);
$stringToArray = explode(" ",$_POST['text']);
foreach($stringToArray as $key=>$val)
$urlvalid = isValidURL($val);
if($urlvalid)
$_SESSION["messages"][] = "NO URLS ALLOWED!";
header("Location: http://www.domain.com/post/id/".$_POST['postID']);
exit();
谢谢! 斯蒂芬
【问题讨论】:
您能否根据有效的代码展示您尝试过的一些代码?这里有更多的人将帮助您解决您正在解决的问题,并为您提供答案。只是得到一个要求并给出一个答案就是我得到报酬的工作。 添加到目前的工作代码中 【参考方案1】:你想要这样的东西:
%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%i
这是使用 |在开头匹配http://
或www
。我将分隔符更改为%
,以避免与|
发生冲突
【讨论】:
这不是真的...第二组是(www\.)
,它需要.
在www.
之后。另外,我在这里针对“wwwtumblr.com”测试了正则表达式:solmetra.com/scripts/regex/index.php,但没有通过。但是,这个 将 匹配类似 www.tumblrcom 的内容。最大的错误可能是第三组中未转义的.
。这些天我通常使用([a-z0-9-]\.)+([a-z0-9-])
来匹配子域和 tld。【参考方案2】:
Daring Fireball 的 John Gruber 为可能感兴趣的所有类型的 URL 发布了一个非常全面的正则表达式。你可以在这里找到它:
http://daringfireball.net/2010/07/improved_regex_for_matching_urls
【讨论】:
实际代码看起来如何?我有字符串 $str = "Blaa lorem ipsum domain-name.studio blaa blaa another.com blaa blaa";我想得到输出:是的,它包含一个或多个域:domain-name.studio another.com 感谢您有时间提供帮助! 我试过了:$found_url = ""; if(preg_match("~^$regex$~i", $description, $m)) $found_url = $m; if(preg_match("~^$regex$~i", $description, $m)) $found_url .= $m;但出现错误:PHP Parse error: syntax error, unexpected ','【参考方案3】:我一开始会分解字符串,因为 url 可能是它的一半,例如hello how are you www.google.com
分解字符串并使用foreach
语句。
例如:
$string = "hello how are you www.google.com";
$string = explode(" ", $string);
foreach ($string as $word)
if ( (strpos($word, "http://") === 0) || (strpos($word, "www.") === 0) )
// Code you want to excute if string is a link
请注意,您必须使用===
运算符,因为strpos
可以返回,将返回一个0
,它看起来是false
。
【讨论】:
如何只提取链接?【参考方案4】:我在下面使用了它,它允许您检测字符串中任何位置的 url。对于我的特定应用程序,它是一个打击垃圾邮件的联系表格,因此不允许使用 url。效果很好。
资源链接:https://css-tricks.com/snippets/php/find-urls-in-text-make-links/
我的实现;
<?php
// Validate message
if(isset($_POST['message']) && $_POST['message'] == 'Include your order number here if relevant...')
$messageError = "Required";
else
$message = test_input($_POST["message"]);
if (strlen($message) > 1000)
$messageError = "1000 chars max";
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]2,3(\/\S*)?/";
if (preg_match($reg_exUrl, $message))
$messageError = "Url's not allowed";
// Validate data
function test_input($data)
$data = trim($data);
$data = stripslashes($data);
$data = htmlspecialchars($data);
return $data;
?>
【讨论】:
将 TLD 限制为 2 到 3 个字符真的很糟糕,请参阅:iana.org/domains/root/db【参考方案5】:试试implode($myarray, '').strstr("www.")==0
。这会将您的数组内爆成一个字符串,然后检查 www.
是否位于字符串的开头(索引 0)。
【讨论】:
我首先分解字符串,因为 url 可能是它的一半,例如你好,你好吗 www.google.com以上是关于使用 preg_match 检测 url?字符串中没有 http://的主要内容,如果未能解决你的问题,请参考以下文章