Проблема с соответствием URL регулярного выражения для http://localhost/ - PullRequest
1 голос
/ 31 августа 2011

Я пытаюсь использовать этот проект на GitHub https://github.com/ErisDS/Migrate для переноса настроек URL в моей базе данных Wordpress из установки Localhost dev на действующий URL.

В данный момент код выдаетошибка для URL-адреса, подлежащего замене "http://localhost/mysitename",, но принимает новый URL-адрес" http://www.mywebsitename.com"

Из того, что я могу сказать, ошибка возникает из-за того, что регулярное выражение не проверяет локальный хост как действительный URL - любые идеи, как я могуобновить это, чтобы принять локальный URL-адрес?

Полный код можно посмотреть на GitHub.

function checkURL($url)
 {
  $url_regex = '/^(http\:\/\/[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/';
if($url == 'http://')
 {
 return false;
 }    
return preg_match($url_regex, $url);
}

Ответы [ 3 ]

2 голосов
/ 31 августа 2011

Вы можете добавить "localhost" к допустимым именам хостов, изменив его на:

/^(http\:\/\/(?:[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}|localhost)(?:\/[a-zA-Z0-9_]+)*(?:\/[a-zA-Z0-9_]+\.[a-zA-Z]{2,4}(?:\?[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)?)?(?:\&[a-zA-Z0-9_]+\=[a-zA-Z0-9_]+)*)$/

Эта часть соответствует префиксу http://:

http\:\/\/

И эта часть соответствует имени хоста:

[a-zA-Z0-9_\-]+(?:\.[a-zA-Z0-9_\-]+)*\.[a-zA-Z]{2,4}

Таким образом, вы можете просто изменить средство проверки имени хоста на группу перехвата без захвата, которая явно включает «localhost»:

(?:X|localhost)

где X - это существующее имя хоста, соответствующее подвыражению. Бит (?: запускает группу без захвата, использование группы без захвата гарантирует, что любые ссылки на номера групп не будут испорчены.

И некоторые живые примеры: http://ideone.com/M0qqh

Я думаю, что простое регулярное выражение может послужить вам лучше, хотя оно не очень хорошо работает с параметрами CGI. Вы можете попробовать это:

/(http:\/\/[^\/]+\/([^\s]+[^,.?!:;])?)/

и посмотрите, работает ли он для ваших данных. Тот довольно свободен, но, вероятно, достаточно хорош для конвертации одним выстрелом. Это должно правильно соответствовать URL в этих:

'here is a URL http://localhost/x?a=b.'
'More http://example.com nonsense!.

Вы также можете попробовать Джозефа из комментария.

1 голос
/ 31 августа 2011

Это не работает, потому что где-то в регулярном выражении вы запрашиваете точку между http:// и /. http://localhost/whatever не имеет точки, поэтому она терпит неудачу.

Вы действительно должны использовать что-то вроде filter_var() или parse_url() вместо регулярных выражений для проверки URL.

0 голосов
/ 06 сентября 2011

Автор сценариев MIGRATE обновил проект на GitHub, чтобы включить это исправление. спасибо за вашу помощь, ребята.

https://github.com/ErisDS/Migrate

...