Подтвердить что ты не робот

Может ли 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-адреса? Как это будет соответствовать моему регулярному выражению?

4b9b3361

Ответ 1

A точка с запятой зарезервирована и не может использоваться без права доступа, кроме специального назначения (которое зависит от схемы). Раздел 2.2:

Многие схемы URL резервируют определенные символы для особого значения: их появление в конкретная часть URL-адреса обозначенная семантика. Если персонаж соответствующий октету зарезервировано в схеме, октет должен быть закодированным. Персонажи ";", "/", "?", ":", "@", "=" и "&" находятся символы, которые могут быть зарезервировано для особого значения в пределах схема. Никакие другие символы не могут быть зарезервировано в рамках схемы.

Ответ 2

W3C рекомендует программам CGI принимать; а также в строках запроса (т.е. обрабатывать ?name=fred&age=50 и ?name=fred;age=50 тем же способом). Это должно быть потому, что оно должно быть закодировано как в HTML, тогда как; нет.

Ответ 3

Полуколона является юридическим символом URI; он относится к категории субграничников: http://www.ietf.org/rfc/rfc3986.txt

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

Ответ 4

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

Ответ 5

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

И некоторые из них используют его в законных целях, хотя он скорее всего зависит от конкретного сайта (т.е. только для использования с этим сайтом), потому что его использование должно определяться сайтом, использующим его.

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

Например, отправив кому-то электронное письмо по этой ссылке:

http://www.yahoo.com/junk/nonsense;0200.0xfe.0x37.0xbf/malicious_file/

приведет к Yahoo! ссылка (www.yahoo.com/junk/nonsense) игнорируется, потому что, хотя она является законной (т.е. правильно сформирована), такая страница не существует. Но вторая ссылка (0200.0xfe.0x37.0xbf/malicious_file/) предположительно существует *, и пользователь будет перенаправлен на страницу malicious_file; после чего один корпоративный ИТ-менеджер получит отчет, и, скорее всего, получит розовый скип.

И прежде, чем все nay-sayers получат свой dander, это как раз то, как новая проблема фишинга Facebook работает. Имена были изменены, чтобы защитить виновных, как обычно.

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

Ответ 6

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

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

https?://[\w!#$%&'()*+,./:;[email protected]\[\]-]+(?<![!,.?;:"'()-])

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

Ответ 7

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

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

 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/ (с небольшими изменениями)