2010-07-08 5 views
0

Можно создать дубликат:
Regular expression for browser UrlREGEX URL регулярное выражение

Является ли это регулярное выражение идеально подходит для любого URL?

preg_match_all(
'/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot){1,}[com|net|org|info\.]+((\.|dot){0,}[a-zA-Z]){0,}+/i', 
$url, $regp); 
+3

'[www]' не так, как вы думаете. Читайте о [классах персонажей] (http://www.regular-expressions.info/charclass.html) – Amarghosh

+1

Вы пишете это самостоятельно? И что вы подразумеваете под любым URL-адресом? – Gumbo

+1

'museum' является допустимым доменным именем верхнего уровня, таким как' com', 'net' и т. Д. – Amarghosh

ответ

0

[www]+ должен быть изменен для (www)?

(\.|dot){1,} - один и более? возможно, вы хотели бы сделать ([a-zA-Z0-9_\.-]+(\.|dot)){1,}

0

A URL также имеет протокол, подобный http, который вам не хватает. Как уже упоминалось, у вас также отсутствует много TLD.

Что-то вроде экранированного пространства (% 20) также не будет распознано.

номера

порт может также появиться в URL (например: 80)

+0

. URL-адрес также может быть относительным. Даже пустая строка является допустимым URL. – Gumbo

+0

В зависимости от того, каким педантиком вы хотите быть, относительный * URI * не является классом * URL *. – bobince

+0

@bobince: все зависит от того, из каких спецификаций вы получаете следующие выражения: RFC 1808 утверждает, что * URL * является наиболее распространенным термином локатора ресурсов, в то время как RFC 3986 использует термин * URI-reference *. – Gumbo

0

Нет, и вы не можете создать регулярное выражение, которое будет анализировать любой URI (или URL или URN) - В только способ разбора их правильно читать по спецификации RFC-3986

2

Не используйте для этого регулярное выражение. Если вы не можете сопротивляться, действительный можно найти здесь: What is the best regular expression to check if a string is a valid URL? , но это регулярное выражение смешно. Попытайтесь использовать свою инфраструктуру для этого, если можете (например, класс Uri в .net).

1

Нет. На самом деле это не совпадает с URL-адресами. Он пытается обнаружить имена хостов, написанные в тексте, например www.example.com.

Его подход заключается в попытке обнаружить некоторые общие известные домены верхнего уровня, но:

[com|net|org|info\.]+ 

фактически группа характеров, позволяя любую последовательность символов из списка |.comnetrgif. Вероятно, это означало:

((com|net|org|info)\.)+ 

[www], а также является так же неправильно, а также бизнес с dot на самом деле не имеет никакого смысла.

Но это, в общем, очень плохая идея. Есть way больше TLDs общего пользования, чем только те и 2-буквенные CCTLD. Также многие/большинство CCTLD не имеют домена com/net/org/info второго уровня. Это выражение не будет соответствовать этим и будет соответствовать множеству других вещей, которые не должны быть именем хоста.

На самом деле задача обнаружения имен хостов в основном невозможна, поскольку одно слово может быть именем хоста, как и любая последовательность слов, разделенная точками. (И поскольку введены интернационализированные доменные имена, почти все может быть именем хоста, например 例え.テスト.)

+0

IP-адрес также является допустимым хостом: 'http: // 127.0.0.1 /' является допустимым абсолютным URL-адресом. – Gumbo

+0

... не говоря уже о адресах IPv6! Попытка сопоставить имена хостов/IP-адреса в тексте никогда не будет надежной. – bobince

1

«любой» URL-адрес - это сложный вызов. В OZ у вас есть .com.au, в Великобритании это .co.uk Каждая страна имеет свой собственный набор правил, и они могут измениться. .xxx только что одобрен. И теперь символы не-ascii были одобрены, но я подозреваю, что вам это не нужно.

Мне было бы интересно, почему вы хотите, чтобы проверка была плотной? Многие URL-адреса, которые являются правильными, будут исключены, и он не исключает всех неправильных URL-адресов. www.thisisnotavalidurl.com все равно будет принят.

Я предлагаю A) используя простую проверку, только для ([a-zA-Z0-9 _.-].) * [A-zA-Z0-9 _.-] (или somthing), так же, как проверка работоспособности B) с помощью обратного поиска, чтобы проверить, действительно ли URL-адрес действителен, если вы хотите разрешить только реальные реальные URL-адреса.

О, и я нахожу это: http://www.fileformat.info/tool/regex.htm, чтобы быть действительно полезным инструментом, если я разрабатываю регулярное выражение, в котором я не очень хорош.

+0

Могу ли я иметь и .com URL-адрес, который может обойти это регулярное выражение? – ITGuru

+0

Могу ли я иметь любой URL-адрес, который может передать этот REGEX preg_match_all ( '/([www]+(\.|dot))?[a-zA-Z0-9_\.-]+(\.|dot) {1,} [com | net | org | info \.] + ((\. | Dot) {0,} [a-zA-Z]) {0,} +/i ', $ url, $ regp); – ITGuru

Смежные вопросы