URL может содержать точку с запятой и все еще быть допустимым?

Я использую регулярное выражение для преобразования URL простого текста в активируемые по щелчку ссылки.

@(https?://([-\w\.]+)+(:\d+)?(/([\w/_\.-]*(\?\S+)?)?)?)@

Однако иногда в теле текста, URL перечисляется тот на строку с точкой с запятой в конце. Реальный URL не содержит никого"";.

http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=275;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=123;
http://www.aaa.org/pressdetail.asp?PRESS_REL_ID=124

Разрешено иметь точку с запятой (;) в URL, или точку с запятой можно считать маркером конца URL? Как это поместилось бы в мое регулярное выражение?

35
задан Josh Habdas 25 November 2019 в 04:39
поделиться

6 ответов

A semicolon is reserved and should only for its special purpose (which depends on the scheme).

Section 2.2:

Many URL schemes reserve certain characters for a special meaning: their appearance in the scheme-specific part of the URL has a designated semantics. If the character corresponding to an octet is reserved in a scheme, the octet must be encoded. The characters ";", "/", "?", ":", "@", "=" and "&" are the characters which may be reserved for special meaning within a scheme. No other characters may be reserved within a scheme.

40
ответ дан 27 November 2019 в 06:38
поделиться

The W3C encourages CGI programs to accept ; as well as & in query strings (i.e. treat ?name=fred&age=50 and ?name=fred;age=50 the same way). This is supposed to be because & has to be encoded as & in HTML whereas ; doesn't.

27
ответ дан 27 November 2019 в 06:38
поделиться

The semi-colon is a legal URI character; it belongs to the sub-delimiter category: http://www.ietf.org/rfc/rfc3986.txt

However, the specification states that whether the semi-color is legitimate for a specific URI or not depends on the scheme or producer of that URI. So, if site using those links doesn't allow semi-colons, then they're not valid for that particular case.

12
ответ дан 27 November 2019 в 06:38
поделиться

http://www.ietf.org/rfc/rfc3986.txt охватывает URL-адреса и символы, которые могут появляться в незакодированной форме. Поскольку URL-адреса, содержащие точки с запятой, правильно работают в браузерах, ваш код должен их поддерживать.

5
ответ дан 27 November 2019 в 06:38
поделиться

Цитирование RFC не очень помогает при ответе на этот вопрос, потому что вы встретите URL-адреса с точкой с запятой (и запятыми, если на то пошло). У нас было регулярное выражение, которое не обрабатывало точки с запятой и запятые, и некоторые из наших пользователей NutshellMail жаловались, потому что URL-адреса, содержащие их, действительно существуют в дикой природе. Попробуйте создать фиктивный URL-адрес в Facebook или Twitter, содержащий ";" или ',', и вы увидите, что эти две службы правильно кодируют полный URL.

Я заменил используемое нами регулярное выражение следующим шаблоном (и проверил, что он работает):

 string regex = @"((www\.|(http|https|ftp|news|file)+\:\/\/)[&#95;.a-zA-Z0-9-]+\.[a-zA-Z0-9\/&#95;:@=.+?,##%&~_-]*[^.|\'|\# |!|\(|?|,| |>|<|;|\)])";

Это регулярное выражение взято из http://rickyrosario.com/blog/converting-a-url-into -a-link-in-csharp-using-regular-expressions / (с небольшими изменениями)

1
ответ дан 27 November 2019 в 06:38
поделиться

Да, точки с запятой допустимы в URL. Однако если вы берете их из относительно неструктурированной прозы, вероятно, можно предположить, что точка с запятой в конце URL подразумевается как пунктуация предложения. То же самое относится и к другим знакам препинания, таким как точка, вопросительный знак, кавычки и т.д..

Если вас интересуют только URL с явным протоколом http[s], и ваш regex поддерживает lookbehinds, этого regex будет достаточно:

https?://[\w! #$%&'()*+,./:;=?@\[\]-]+(?

После протокола он просто подбирает один или несколько символов, которые могут быть допустимыми в URL, не заботясь о структуре. Но затем он отступает на столько позиций, сколько необходимо, пока последний символ не окажется чем-то, что может быть пунктуацией предложения.

4
ответ дан 27 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: