web-dev-qa-db-ja.com

preg_matchを使用してURLを検出しますか?文字列にhttp://がない

配列に分割された文字列を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();
     }
     }

ありがとう!ステファン

12
Stefan P

あなたは次のようなものが欲しいです:

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

これは|を使用しています最初にhttp://またはwwwのいずれかに一致します。 %との衝突を避けるために、区切り文字を|に変更しました

13
Igor Serebryany

Daring FireballのJohn Gruberが、関心のあるすべてのタイプのURLに対して非常に包括的な正規表現を投稿しました。あなたはそれをここで見つけることができます:

http://daringfireball.net/2010/07/improved_regex_for_matching_urls

9
mromaine

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は返すことができ、===falseのように見えるため、0演算子を使用する必要があります。

1
John Smith

以下でこれを使用しました。これにより、文字列内の任意の場所で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;
}
?>
1
user5340092