Кратчайшее соответствие URL регулярному выражению в JavaScript


16

Создайте самое короткое регулярное выражение, которое будет примерно соответствовать URL в тексте при запуске в JavaScript

Пример:

"some text exampley.com".match(/your regular expression goes here/);

Регулярное выражение должно

  • захватить все действительные URL-адреса, которые для http и https.
  • не беспокойтесь о несоответствии для строк поиска URL, которые на самом деле не являются действительными URL-адресами, такими как super.awesome/cool
  • быть действительным при запуске в качестве регулярного выражения JavaScript

Критерии испытаний:

Совпадение:

Не соответствует:

  • пример
  • очень круто
  • Доброе утро
  • Я могу
  • Здравствуйте.

Вот тест, который может помочь немного прояснить http://jsfiddle.net/MikeGrace/gsJyr/

Я прошу прощения за отсутствие ясности, я не понял, насколько ужасно соответствовали URL.


Ahgrrrr! Я скучаю по своим правам редактирования! Если вы собираетесь ограничить игру одним языком, возможно, вам следует пометить его этим языком.
dmckee

Что представляет собой действительный символ URL? потому что я могу просто использовать \wдля всего Вы ожидаете обратных ссылок для различных компонентов URL?
Мин-Тан

1
«URI - это последовательность символов из очень ограниченного набора, то есть букв основного латинского алфавита, цифр и нескольких специальных символов», согласно RFC 2396 .
RunnerRick

Майк: я думаю, что есть еще некоторые разъяснения по порядку. В настоящее время я могу просто использовать /:/в качестве регулярного выражения и сопоставлять допустимые URI, и не соответствовать всем вашим примерам в списке »Не совпадает«. Пока вы идете по этому маршруту, это просто вопрос: каково самое короткое регулярное выражение, которое не будет соответствовать ни одной из строк примера, но все же перехватит все URI.
Джои

1
Просто попробуйте написать более сложную задачу с более подробной информацией.

Ответы:


1
/.+\.\w\w.*/

не соответствует 3 строкам, которые не должны, соответствует почти чему-либо еще;)
upd: все равно не соответствует всем 5


14

Этот работает:

var re = /(^|\s)((https?:\/\/)?[\w-]+(\.[\w-]+)+\.?(:\d+)?(\/\S*)?)/gi;

/*
(^|\s)                            : ensure that we are not matching an url 
                                    embeded in an other string
(https?:\/\/)?                    : the http or https schemes (optional)
[\w-]+(\.[\w-]+)+\.?              : domain name with at least two components;
                                    allows a trailing dot
(:\d+)?                           : the port (optional)
(\/\S*)?                          : the path (optional)
*/

Проходит тесты на http://jsfiddle.net/9BYdp/1/

Также соответствует:

  • example.com. (конечная точка)
  • example.com:8080 (порт)

Сладость !!!!!!!
Майк Грейс,

2
Разве вы не хотите сопоставлять имя хоста только с одним компонентом (например, localhost)?
RunnerRick

Это позволяет пробелы
brenjt

работает для меня. ты :)
СТАЛЬ

Работает хорошо, но не для доменов с частями пользователя / пароля, напримерhttp://user:password@domain.com/path
Radon8472

5

Это, очевидно, не соответствует вашим намерениям, но соответствует вашим критериям:

 /.*/
  • msgstr "соответствовать всем действительным URL-адресам для http и https."

    да, определенно будет соответствовать.

  • «не беспокойтесь о несоответствии для строк, выглядящих как URL, которые на самом деле не являются действительными URL, такими как« super.awesome / cool »»

    да, конечно, будет много ложных срабатываний, но вы сказали, что это не имеет значения.

  • быть действительным при запуске в качестве регулярного выражения JavaScript

    конечно, как яйца работают так, как вы говорите, должны.

Если этот результат НЕ верный ответ, то вам нужно быть более избирательным с вашими критериями.

Для того , чтобы быть правилом , что работает , как вы собираетесь, вы на самом деле сделать необходимость осуществления совместимого Искателя полного RFC, а также полного RFC совместимых согласовани будут «беспокоиться о не соответствует».

Таким образом, в терминах «разрешение не соответствует» необходимо указать , какие именно отклонения от RFC допустимы.

Все остальное, и все это упражнение является обманом, потому что люди просто напишут все, что работает для них, или как им это нравится, и пожертвуют «осмыслением» ради того, чтобы быть короткими (как я сделал).

На вашем обновлении

Самое наивное регулярное выражение, которое я могу придумать, которое соответствует (и захватывает) все ваши вставленные примеры:

/(\S+\.[^/\s]+(\/\S+|\/|))/g;

Он довольно прост по своей природе и предполагает только 3 основных формы.

x.y
x.y/
x.y/z 

zможет быть пыльник, а не пробел. xможет быть все, что не является пробелом. yможет быть чем-либо, что не является ни пробелом, ни символом '/'.

Есть много вещей, которые будут применимы к этому правилу, но они по крайней мере будут выглядеть как действительный URI для человека, они просто не будут совместимы со спецификациями.

например:

hello.0/1  # valid 
1.2/1 # valid 
muffins://¥.µ/€  # probably valid

Я думаю, что разумный подход состоит в том, чтобы извлечь вещи, которые, вероятно, являются URI, а затем проверить их более строгим образом, я смотрю на разработку того, как использовать класс URI браузера для проверки их =).

Но вы можете увидеть приведенные выше рассуждения, работающие над этим образцом здесь: http://jsfiddle.net/mHbXx/


Он изменил вопрос, но в любом случае вы можете добиться большего успеха /:/даже после редактирования :-)
Joey

Спасибо Майк =). Я не хочу соревноваться в более серьезной манере, другие предложения более полезны, я просто хотел бы указать на проблему с первоначальной предпосылкой, чтобы качество вопроса могло улучшиться =)
Кент Фредрик,

Это только я или это совпадение "www .google .com"?
Скьявини

1
/https?\:\/\/\w+((\:\d+)?\/\S*)?/

Попробуй это.

Я включаю начальные и конечные слэши, которые ограничивают регулярное выражение, так что, надеюсь, это не повредит количеству моих персонажей!

Этот шаблон ограничивает протокол протоколом http или https, позволяет указать необязательный номер порта, а затем разрешает ввод любых символов, кроме пробелов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.