Найкоротша відповідність 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.
Joey

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

працює для мене. ty :)
СТАЛЬ

http://user:password@domain.com/path
Добре

5

Це, очевидно, не робить те, що ви маєте намір, але відповідає вашим критеріям:

 /.*/
  • "відповідати всім дійсним 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"?
Schiavini

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

Спробуйте це.

Я включаю провідні та сліди, які обмежують регулярний вираз, так що, сподіваюся, це не зашкодить моєму персонажу!

Цей шаблон обмежує протокол до http або https, дозволяє отримати додатковий номер порту, а потім дозволяє будь-який символ, окрім пробілу.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.