Обнаружение URL с помощью preg_match? без http: // в строке - PullRequest
10 голосов
/ 04 мая 2010

Мне было интересно, как я могу проверить строку, разбитую на массив, по 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

Ответы [ 5 ]

12 голосов
/ 04 мая 2010

Вы хотите что-то вроде:

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

это использует | соответствовать либо http://, либо www в начале. Я изменил разделитель на %, чтобы избежать столкновения с |

9 голосов
/ 29 апреля 2011

Джон Грубер из Daring Fireball опубликовал очень подробное регулярное выражение для всех типов URL, которые могут представлять интерес. Вы можете найти его здесь:

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

0 голосов
/ 26 марта 2018

Я использовал это ниже, что позволяет вам определять 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;
}
?>
0 голосов
/ 15 августа 2012

Сначала я взрываю строку, так как 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.

0 голосов
/ 04 мая 2010

Попробуйте implode($myarray, '').strstr("www.")==0. При этом ваш массив будет объединен в одну строку, а затем проверяется, находится ли www. в начале строки (индекс 0).

...