Обнаружение 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();
}
}
Спасибо! Стефан
5 answers
Вы хотите что-то вроде:
%^((https?://)|(www\.))([a-z0-9-].?)+(:[0-9]+)?(/.*)?$%i
Это использование | для соответствия либо http://
, либо www
в начале. Я изменил разделитель на %
, чтобы избежать столкновения с |
Джон Грубер из Daring Fireball опубликовал очень полное регулярное выражение для всех типов URL-адресов, которые могут представлять интерес. Вы можете найти его здесь:
Http://daringfireball.net/2010/07/improved_regex_for_matching_urls
Сначала я разрываю строку, так как 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
.
Я использовал это ниже, которое позволяет вам определять 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;
}
?>
Попробуйте implode($myarray, '').strstr("www.")==0
. Это преобразует ваш массив в одну строку, а затем проверяет, находится ли www.
в начале строки (индекс 0).