使用 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://的主要内容,如果未能解决你的问题,请参考以下文章

php表单 - 验证邮件和URL

php 正则替换特殊字符 和检测是否是中文

preg_match() 给出未知修饰符 '$'

在字符串上检测并转换utf-8

从字符串中获取所有图像 url [重复]

如何获取网页的url