Intereting Posts
Код написан в Hack быстрее, чем код, написанный на PHP на HHVM? Обзор нескольких звезд на той же странице How-To: рейтинг результатов поиска php PDO вставляет несколько строк в несколько строк с заполнителями Я не могу исправить проблему, связанную с синтаксической ошибкой HEREDOC Symfony2: выбор всех переводов под родителем Функция php mail (): как отображать изображения и использовать стиль в сообщении html Разбирайте таблицу внешнего веб-сайта Чтение из трубы STDIN при использовании proc_open Установите php 5.3 или 5.4 на Ubuntu 16.04 Xenial и apache Можно ли несколько раз вызвать curl_setopt с CURLOPT_HTTPHEADER, чтобы установить несколько заголовков? Тернарный оператор, не работающий со ссылочными переменными в PHP Многомерный массив – как получить определенные значения из подматрицы Laravel 4 – Красноречивый. Бесконечные дети в полезный массив? Получать значения столбцов одноранговой сети из одной таблицы с помощью Codeigniter и MySQL

Как извлечь HTTP-ссылки из абзаца и сохранить их в массиве на php

У меня есть большой текст внутри var на php, im ищет хороший и быстрый метод для извлечения всех ссылок внутри этого текста и хранения их в массив.

Текст простой ascii, и ссылки являются общими, такими как http://thesite.com или http://www.thesite.com . Спасибо за любую помощь.

 $text = 'Lorem ipsum http://thesite.com dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt https://www.thesite.com ut labore et dolore magna aliqua. Ut http://www.thesite.com enim ad minim veniam,'; $pattern = '!(https?://[^\s]+)!'; // refine this for better/more specific results if (preg_match_all($pattern, $text, $matches)) { list(, $links) = ($matches); print_r($links); } 

Найдите google для любого «URL Regex», затем вставьте его в следующий код:

 preg_match_all("/your url regex here/",$text,$matches); 

все совпадения теперь сохраняются как массив в $ matches [0].

Ну, эти регулярные выражения здесь все приятные и, тем не менее, они со временем растут, и, в конце концов, все может выглядеть несколько иначе. Это не все мои заслуги и не все идеально, это один из кодов из проекта сообщества, который несколько лет назад вернулся, и я не хочу говорить, что он идеален, однако он подходит для некоторых потребностей. Скомпилировал его в одну функцию:

 echo make_clickable('test http://www.google.com/'); /** * make_clickable * * make a text clickable * * @param string $text to make clickable * @param callback $url callback to process URLs * @return string clickable text * @author hakre and contributors * @license GPL */ function make_clickable($text, $url = null) { if (null === $url) $callback_url = function($url) {return $url;}; else $callback_url = $url; $ret = ' ' . $text; // urls $save = ini_set('pcre.recursion_limit', 10000); $retval = preg_replace_callback('#(?<!=[\'"])(?<=[*\')+.,;:!&$\s>])(\()?([\w]+?://(?:[\w\\x80-\\xff\#%~/?@\[\]-]{1,2000}|[\'*(+.,;:!=&$](?![\b\)]|(\))?([\s]|$))|(?(1)\)(?![\s<.,;:]|$)|\)))+)#is', function($matches) use ($callback_url) { $url = $matches[2]; $suffix = ''; /** Include parentheses in the URL only if paired **/ while ( substr_count( $url, '(' ) < substr_count( $url, ')' ) ) { $suffix = strrchr( $url, ')' ) . $suffix; $url = substr( $url, 0, strrpos( $url, ')' ) ); } $url = $callback_url($url); if ( empty($url) ) return $matches[0]; return $matches[1] . "<a href=\"$url\">$url</a>" . $suffix; }, $ret); if (null !== $retval ) $ret = $retval; ini_set('pcre.recursion_limit', $save); // web ftp $ret = preg_replace_callback('#([\s>])((www|ftp)\.[\w\\x80-\\xff\#$%&~/.\-;:=,?@\[\]+]+)#is', function ($matches) use ($callback_url) { $ret = ''; $dest = $matches[2]; $dest = 'http://' . $dest; $dest = $callback_url($dest); if ( empty($dest) ) return $matches[0]; // removed trailing [.,;:)] from URL if ( in_array( substr($dest, -1), array('.', ',', ';', ':', ')') ) === true ) { $ret = substr($dest, -1); $dest = substr($dest, 0, strlen($dest)-1); } return $matches[1] . "<a href=\"$dest\">$dest</a>$ret"; }, $ret); // email $ret = preg_replace_callback('#([\s>])([.0-9a-z_+-]+)@(([0-9a-z-]+\.)+[0-9a-z]{2,})#i', function($matches) { $email = $matches[2] . '@' . $matches[3]; return $matches[1] . "<a href=\"mailto:$email\">$email</a>"; }, $ret); $ret = preg_replace("#(<a( [^>]+?>|>))<a [^>]+?>([^>]+?)</a></a>#i", "$1$3</a>", $ret); $ret = trim($ret); return $ret; } 

Вы должны использовать регулярные выражения. preg и ereg интересны в PHP, учитывая, что ereg проще в использовании, но медленнее.

Вот простой вызов preg, который будет получать URL-адреса из $ text.

 preg_match_all("/https?:\/\/[^\s]+/i", $text, $urls); 

$ urls – это массив ваших URL-адресов.