使用preg_match检测字符串中是否包含不带"http://"的url?

13
我想知道如何将一个被分割成数组的字符串与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();
     }
     }

谢谢! Stefan


2
你能展示一些你尝试过的代码吗?基于那个可行的代码。这里有更多的人会帮助你解决你正在处理的问题,而不是直接给你答案。只是得到一个需求并产生一个答案是我得到报酬的方式。 - Devin Ceartas
到目前为止,已经添加了工作代码。 - Stefan P
5个回答

16

您想要的是类似这样的东西:

%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%i

这里使用 | 来匹配以 http:// 或者 www 开头。我将分隔符改为 %,以避免与 | 冲突。


6
这不是真的。第二个组是(www\.),需要在www.后面加上一个.。此外,我在http://www.solmetra.com/scripts/regex/index.php上测试了正则表达式,但它没有通过测试'wwwtumblr.com'。然而,这匹配类似www.tumblrcom的内容。最大的错误可能是第三个组中未转义的`.`。现在我通常使用`([a-z0-9-]\.)+([a-z0-9-])` 来匹配子域名和顶级域名。 - Igor Serebryany

10

实际代码是什么样子的?我有一个字符串 $str = "Blaa lorem ipsum domain-name.studio blaa blaa another.com blaa blaa"; 我想要得到输出:是的,它包含一个或多个域名: domain-name.studio another.com如果您有时间帮忙,感谢! - Kaspar L. Palgi
我尝试了以下代码: $found_url = ""; if(preg_match("^$regex$i", $description, $m)) { $found_url = $m; } if(preg_match("^$regex$i", $description, $m)) { $found_url .= $m; }但是出现了错误:PHP解析错误:语法错误,意外的','。 - Kaspar L. Palgi

1
我使用了以下代码,可以在字符串中任何位置检测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;
}
?>

将顶级域名从2个字符限制到3个字符真的很差劲,请参见:https://www.iana.org/domains/root/db - Toto

1

我首先将字符串分解,因为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


你如何仅提取链接? - Sobiaholic

-2

尝试使用implode($myarray, '').strstr("www.")==0。这将把您的数组合并为一个字符串,然后检查字符串开头(索引0)是否为www.


我首先将字符串分解,因为网址可能在其中间,例如:hello how are you www.google.com。 - Stefan P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接