У меня есть большой текст внутри 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-адресов.