2017-02-19 52 views
0

Для извлечения URL (не идеальное решение, но я почти доволен, как подсчетов производительности) Я используюИзвлечь URL из строки с использованием PHP, если какой-либо из двух специальных символов в URL-адресе следует рассматривать как разделители (первые символы, за которыми следует URL-адрес)?

preg_match_all('#\bhttps?://[^,\s()<>]+(?:\([\w\d]+\)|([^,[:punct:]\s]|/))#', $string, $match); 

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

Я знаю, что эти символы являются действительными символами в URL-адресах, однако для моего случая они должны быть недействительными. Как должно быть слегка изменено preg_match_all, чтобы знать об этих двух разделителях? Спасибо.

+0

Acccording в RFC (http://www.faqs.org/rfcs/rfc1738.html), этих двух символа объявляются как «небезопасные» и должны быть закодированы. Вы действительно имеете их в некоторых URL-адресах ?. Если вы хотите их сопоставить, замените '[: punct:]' на список «punct» символов минус эти два символа. – Toto

+0

Спасибо. Но попытался заменить [^, [: punct:] \ s] на [^, \ | \ s] (даже для одного «|») без везения. – Haradzieniec

ответ

1

[:punct:] - краткое описание для [!"\#$%&'()*+,\-./:;<=>[email protected]\[\\\]^_``{|}~].

В вашем регулярном выражении вы используете отрицательный класс символов [^,[:punct:]\s], который может быть записан как: [^!"\#$%&'()*+,\-./:;<=>[email protected]\[\\\]^_``{|}~\s] (Я удалил первую запятую, потому что она уже существует, и я дублирую backquote для выделения).

Если вы хотите, чтобы ] и |, удалить их из класса символов:

[^!"\#$%&'()*+,\-./:;<=>[email protected]\[\\^_`{}~\s] 
+0

Большое спасибо за ваш ответ и ваше объяснение. – Haradzieniec