Вы сделали несколько ошибок в регулярном выражении. Ничего фатального, я не думаю, но тем не менее, всего лишь несколько разных вещей, которые вы можете сделать, чтобы очистить его. Вы поставили круглые скобки вокруг http, и они не должны быть там. Похоже, вы не захватываете его для использования позже. Если вы пытаетесь сделать http: // part необязательным, вы захотите использовать (?: Http: \ / \ /)? вместо. Также обратите внимание, что вам нужно избегать обратной косой черты в строке. Будет ли это работать так же хорошо?
$regex = "/^".
"(?:http:\\/\\/)?". // Look for http://, but make it optional.
"(?:[A-Z0-9][A-Z0-9_-]*(?:\\.[A-Z0-9][A-Z0-9_-]*))". // Server name
"(?:\\d+)?". // Optional port number
"(?:\\/\\.*)?/i"; // Optional training forward slash and page info
Вероятно, есть более подходящие регулярные выражения для соответствующих URL-адресов. Я бы предложил Googling regex url и взглянул на них. Не изобретайте велосипед, если не нужно! Также обратите внимание, что вышеупомянутое не допускает URL-адреса без доменов верхнего уровня, например http://localhost/mypage.html.. Если поставить знак вопроса перед двойными кавычками в строке «Имя сервера», это должно разрешать использование нерекламных URL-адресов. .
Это немного неэффективно:
if(!filter_var($str, FILTER_VALIDATE_URL) || (!preg_match($regex, $str))) //if invalid URL
{
return FALSE;
}
else
{
return TRUE;
}
Ваше выражение даст значение true / false. Как насчет того, чтобы просто вернуть это, отрицать при необходимости?
return !(!filter_var($str, FILTER_VALIDATE_URL) || !preg_match($regex, $str));
Также обратите внимание, что эти выражения эквивалентны:
!(!A || !B)
A && B
Так что это можно упростить до:
return filter_var($str, FILTER_VALIDATE_URL) && preg_match($regex, $str);