Я пытаюсь выяснить способ получения массива URL-адресов из строки текста. Текст будет отформатирован следующим образом:
Некоторые случайные тексты здесь
- PHP .htaccess -> довольно url (в обратном порядке)
- Не разрешать символ «@» в URL-адресе Codeigniter
- Передача переменной на страницах через URL
- PHP / RegEx - конвертировать URL-адреса в ссылки, обнаруживая .com / .net / .org / .edu и т. Д.
- Получить содержимое файла XML с помощью PHP
http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphones-bezel-a-massive-notification-light/?grcc=88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2=835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033fdeed202~510f37324b14c50a5e9121f955fac3fa ~ 1342747216490 ~ 0 ~ 0 ~ 0 ~ 0 ~ 0 ~ 0 ~ 0 ~ 0 ~ 7 ~ 3 ~
Last Day To Purchase Extra Early Bird Tickets For Disrupt SF
Очевидно, что эти ссылки могут быть любыми (и может быть много ссылок, это те, которые я тестирую сейчас. Если я использую простой URL, например, мое регулярное выражение работает нормально.
Я использую:
preg_match_all('((https?|ftp|gopher|telnet|file|notes|ms-help):'. '((//)|(\\\\))+[\w\d:#@%/;$()~_?\+-=\\\.&]*)', $bodyMessage, $matches, PREG_PATTERN_ORDER);
Когда я делаю print_r( $matches);
я получаю:
Array ( [0] => Array ( [0] => http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= [1] => http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= [2] => http://techcrunch.co= [3] => http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-ip= [4] => http://techcrunch.com/2012/07/20/last-day-to-purc= [5] => http://tec= ) ...
Ни один из этих элементов в этом массиве не содержит полных ссылок из приведенных выше ссылок.
Кто-нибудь знает хороший способ получить то, что мне нужно? Я нашел кучу ресурсов регулярных выражений, чтобы получить ссылки на PHP, но ничто из этого не работает.
Благодаря!
Редактировать:
Хорошо, поэтому я потянул эти ссылки с электронной почты. Скрипт анализирует электронную почту, захватывает тело сообщения, а затем пытается схватить ссылки из этого. После изучения электронной почты кажется, что это почему-то добавляет пробел в середине URL-адреса. Вот результат сообщения body, как видно из моего PHP-скрипта.
--00248c711bb99ca36d04c54ba5c6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= es-bezel-a-massive-notification-light/?grcc=3D88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2= =3D835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033f= deed202~510f37324b14c50a5e9121f955fac3fa~1342747216490~0~0~0~0~0~0~0~0~7~3~ http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= ets-for-disrupt-sf/ --00248c711bb99ca36d04c54ba5c6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
Любые предложения о том, как сделать это, не нарушают URLS?
EDIT 2
По предложению Лаурнета я запустил этот код:
$bodyMessage = str_replace("= ", "",$bodyMessage);
Однако, когда я повторяю это, он, похоже, не хочет заменять «=»,
--00248c711bb99ca36d04c54ba5c6 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable http://techcrunch.com/2012/07/20/kickstarter-flashr-wants-to-make-the-iphon= es-bezel-a-massive-notification-light/?grcc=3D88888Z0ZwdgtZ0Z0Z0Z0Z0&grcc2= =3D835637c33f965e6cdd34c87219233711~1342828462249~fca4fa8af1286d8a77f26033f= deed202~510f37324b14c50a5e9121f955fac3fa~1342747216490~0~0~0~0~0~0~0~0~7~3~ http://techcrunch.com/2012/07/20/last-day-to-purchase-extra-early-bird-tick= ets-for-disrupt-sf/ --00248c711bb99ca36d04c54ba5c6 Content-Type: text/html; charset=ISO-8859-1 Content-Transfer-Encoding: quoted-printable
/** * * @get URLs from string (string maybe a url) * * @param string $string * @return array * */ function getUrls($string) { $regex = '/https?\:\/\/[^\" ]+/i'; preg_match_all($regex, $string, $matches); //return (array_reverse($matches[0])); return ($matches[0]); }
Вместо этого используйте следующее регулярное выражение.
$regex = "(?i)\b((?:https?://|www\d{0,3}[.]|[a-z0-9.\-]+[.][az]{2,4}/)(?:[^\s()<>]+|\(([^\s()<>]+|(\([^\s()<>]+\)))*\))+(?:\(([^\s()<>]+|(\([^\s()<>]+\)))*\)|[^\s`!()\[\]{};:'\".,<>?«»“”'']))";
Надеюсь, поможет.