Извлечение URL из текста в PHP
92882 просмотра
11 ответа
У меня есть этот текст:
$string = "this is my friend's website http://example.com I think it is coll";
Как извлечь ссылку в другую переменную?
Я знаю, что это должно быть с помощью регулярных выражений, особенно, preg_match()
но я не знаю, как?
Ответы (11)
45 плюса
Вероятно, самый безопасный способ - использовать фрагменты кода из WordPress. Загрузите последнюю версию (в настоящее время 3.1.1) и посмотрите wp-includes / formatting.php. Есть функция с именем make_clickable, которая имеет простой текст для параметра и возвращает отформатированную строку. Вы можете получить коды для извлечения URL-адресов. Это довольно сложно, хотя.
Это регулярное выражение в одну строку может быть полезным.
preg_match_all('#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#', $string, $match);
Но это регулярное выражение по-прежнему не может удалить некоторые некорректные URL (например http://google:ha.ckers.org
).
См. Также: Как имитировать поведение Auto-Link в StackOverflow
Автор: Nobu Размещён: 17.04.2011 12:2715 плюса
Я пытался сделать, как сказал Нобу, используя Wordpress, но с большим количеством зависимостей от других функций WordPress, я вместо этого решил использовать регулярное выражение Nobu для preg_match_all()
и превратил его в функцию, используя preg_replace_callback()
; функция, которая теперь заменяет все ссылки в тексте ссылками. Он использует анонимные функции, поэтому вам понадобится PHP 5.3, или вы можете переписать код, чтобы использовать вместо него обычную функцию.
<?php
/**
* Make clickable links from URLs in text.
*/
function make_clickable($text) {
$regex = '#\bhttps?://[^\s()<>]+(?:\([\w\d]+\)|([^[:punct:]\s]|/))#';
return preg_replace_callback($regex, function ($matches) {
return "<a href=\'{$matches[0]}\'>{$matches[0]}</a>";
}, $text);
}
Автор: Mikael Roos
Размещён: 23.03.2012 11:24
12 плюса
URL-адреса имеют довольно сложное определение - вы должны решить, что вы хотите захватить в первую очередь. Простой пример захвата ничего , начиная с http://
и https://
может быть:
preg_match_all('!https?://\S+!', $string, $matches);
$all_urls = $matches[0];
Обратите внимание, что это очень просто и может захватывать недействительные URL. Я бы порекомендовал ознакомиться с регулярными выражениями POSIX и PHP для более сложных вещей.
Автор: soulmerge Размещён: 26.05.2009 02:218 плюса
Если текст, из которого вы извлекаете URL-адреса, отправлен пользователем и вы собираетесь отображать результат в виде ссылок где угодно, вам следует быть ОЧЕНЬ ОЧЕНЬ осторожными, чтобы избежать уязвимостей XSS , в первую очередь URL-адресов протокола "javascript:", но также искаженных URL-адреса, которые могут обмануть ваше регулярное выражение и / или отображающий браузер для выполнения их как URL-адреса Javascript. По крайней мере, вы должны принимать только те URL, которые начинаются с «http», «https» или «ftp».
Есть также запись в блоге Джеффа, где он описывает некоторые другие проблемы с извлечением URL.
Автор: Michael Borgwardt Размещён: 26.05.2009 02:305 плюса
Вы могли бы сделать как это ..
<?php
$string = "this is my friend's website http://example.com I think it is coll";
echo explode(' ',strstr($string,'http://'))[0]; //"prints" http://example.com
Автор: Shankar Damodaran
Размещён: 24.12.2013 06:02
5 плюса
Код, который работал для меня (особенно если у вас есть несколько ссылок в вашей строке $):
$string = "this is my friend's website http://example.com I think it is cool, but this is cooler http://www.memelpower.com :)";
$regex = '/\b(https?|ftp|file):\/\/[-A-Z0-9+&@#\/%?=~_|$!:,.;]*[A-Z0-9+&@#\/%=~_|$]/i';
preg_match_all($regex, $string, $matches);
$urls = $matches[0];
// go over all links
foreach($urls as $url)
{
echo $url.'<br />';
}
Надеюсь, что это помогает и другим.
Автор: Kai Noack Размещён: 12.04.2014 06:424 плюса
preg_match_all('/[a-z]+:\/\/\S+/', $string, $matches);
Это простой способ, который сработает во многих случаях, но не во всех. Все совпадения помещаются в $ совпадений. Обратите внимание, что это не распространяется на ссылки в элементах привязки ( Автор: runfalk Размещён: 26.05.2009 02:19
2 плюса
preg_match_all ("/a[\s]+[^>]*?href[\s]?=[\s\"\']+".
"(.*?)[\"\']+.*?>"."([^<]+|.*?)?<\/a>/",
$var, &$matches);
$matches = $matches[1];
$list = array();
foreach($matches as $var)
{
print($var."<br>");
}
Автор: user923477
Размещён: 01.09.2011 12:54
2 плюса
Вы можете попробовать это найти ссылку и пересмотреть ссылку (добавьте ссылку href).
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
// The Text you want to filter for urls
$text = "The text you want to filter goes here. http://example.com";
if(preg_match($reg_exUrl, $text, $url)) {
echo preg_replace($reg_exUrl, "<a href="{$url[0]}">{$url[0]}</a> ", $text);
} else {
echo "No url in the text";
}
см. здесь: http://php.net/manual/en/function.preg-match.php
Автор: HTML5 developer Размещён: 11.03.2015 08:440 плюса
Это Regex прекрасно работает для меня, и я проверил со всеми типами URL,
<?php
$string = "Thisregexfindurlhttp://www.rubular.com/r/bFHobduQ3n mixedwithstring";
preg_match_all('/(https?|ssh|ftp):\/\/[^\s"]+/', $string, $url);
$all_url = $url[0]; // Returns Array Of all Found URL's
$one_url = $url[0][0]; // Gives the First URL in Array of URL's
?>
Проверено с большим количеством URL можно найти здесь http://www.rubular.com/r/bFHobduQ3n
Автор: Vignesh Chinnaiyan Размещён: 19.09.2016 01:050 плюса
public function find_links($post_content){
$reg_exUrl = "/(http|https|ftp|ftps)\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?/";
// Check if there is a url in the text
if(preg_match_all($reg_exUrl, $post_content, $urls)) {
// make the urls hyper links,
foreach($urls[0] as $url){
$post_content = str_replace($url, '<a href="'.$url.'" rel="nofollow"> LINK </a>', $post_content);
}
//var_dump($post_content);die(); //uncomment to see result
//return text with hyper links
return $post_content;
} else {
// if no urls in the text just return the text
return $post_content;
}
}
Автор: karolkarp
Размещён: 23.08.2017 08:08
Вопросы из категории :
- php Как вы отлаживаете PHP-скрипты?
- php Заставьте XAMPP / Apache обслуживать файл вне htdocs
- php Как включить файлы PHP, которые требуют абсолютного пути?
- php Скрипт входа со скрытыми кнопками
- php How can I find unused functions in a PHP project
- php Эффективное изменение размера JPEG изображения в PHP
- html Определить часовой пояс пользователя
- html Как определить, какой из указанных шрифтов был использован на веб-странице?
- html Как мне дать моим веб-сайтам значок для iPhone?
- html Как отключить автозаполнение браузера в поле веб-формы / теге ввода?
- html Как автоматически изменить размер текстовой области с помощью Prototype?
- html Как вы можете настроить номера в упорядоченном списке?
- regex Learning Regular Expressions
- regex Regex и unicode
- regex Мое регулярное выражение слишком подходит. Как мне это остановить?
- regex Как выполнить подстановку Perl для строки, сохранив оригинал?
- regex Замена n-го экземпляра совпадения с регулярным выражением в Javascript
- regex Как заменить простые URL ссылками?