Вы можете добавить "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!.
Вы также можете попробовать Джозефа из комментария.