2016-04-12 4 views
17

Как мы можем использовать PHP для определения URL-адреса в строке и сохранения их в массиве?Извлечь URL из строки с помощью PHP

Это пример строки.

$text = "The text you want to filter goes here. http://google.com, https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/"; 

Я не могу использовать функцию explode, потому что, если URL содержит запятую, он не будет давать правильные результаты.

print_r (explode(" ",$text)); 

ответ

36

Regex является ответом на вашу проблему. Принимая ответ Манипулятор объектов .. все это не хватает, чтобы исключить «запятые», так что вы можете попробовать этот код, исключающий их и дает 3 отделенный URL, в качестве вывода:

$string = "The text you want to filter goes here. http://google.com, https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/"; 

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

echo "<pre>"; 
print_r($match[0]); 
echo "</pre>"; 

, а выход

Array 
(
    [0] => http://google.com 
    [1] => https://www.youtube.com/watch?v=K_m7NEDMrV0 
    [2] => https://instagram.com/hellow/ 
) 
+2

Возможно, вы захотите сделать его нечувствительным к регистру, добавив модификатор 'i'. то есть. '... # i'' – MrWhite

+0

Просто обратите внимание, что некоторые URL-адреса используют запятые в своих строках запроса – relipse

+0

@aampudia: Очень хороший подход. Но есть ли простой способ найти URL-адреса без протокола? Например: «Текст, который вы хотите отфильтровать, находится здесь. Www.google.de, www.youtube.com». – Marco

3

Вы можете попробовать Regex здесь:

$string = "The text you want to filter goes here. http://google.com, https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/"; 

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

echo "<pre>"; 
print_r($match[0]); 
echo "</pre>"; 

Это дает следующий результат:

Array 
(
    [0] => http://google.com 
    [1] => https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/ 
) 
+4

он должен иметь 3 результата в выходном массиве. а не 2. 'http: // google.com',' https: //www.youtube.com/watch? v = K_m7NEDMrV0' и 'https: // instagram.com/hellow /' –

2

попробовать этот

function getUrls($string) 
{ 
$regex = '/https?\:\/\/[^\" ]+/i'; 
preg_match_all($regex, $string, $matches); 
return ($matches[0]); 
} 
$urls = getUrls($string); 
print_r($urls); 

или

$str = '<a href="http://foobar.com"> | Hello world Im a http://google.fr |  Did you mean:http://google.fr/index.php?id=1&b=6#2310'; 
$pattern = '`.*?((http|ftp)://[\w#$&+,\/:;[email protected]]+)[^\w#$&+,\/:;[email protected]]*?`i'; 
if (preg_match_all($pattern,$str,$matches)) 
{ 
print_r($matches[1]); 
} 

он будет работает

+0

Нет, все же его предоставление 2 Результаты. есть 3 URL, но возвращается только 2. можно увидеть? 'Array ([0] => http://google.com, [1] => https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/)' –

+0

http://stackoverflow.com/questions/4390556/extract-url-from-string, может быть, это поможет вам – khan

+0

может ли вы представить пример с этим регулярным выражением? –

4

, пожалуйста, попробуйте использовать регулярное выражение ниже

$regex = '/https?\:\/\/[^\",]+/i'; 
preg_match_all($regex, $string, $matches); 
echo "<pre>"; 
print_r($matches[0]); 

Надеется, что это будет работать для вас

2
$urlstring = "The text you want to filter goes here. http://google.com, https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/"; 

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

print_r($result[0]); 
+0

нет, он по-прежнему дает только 2 URL. он должен дать 3 URL-адреса в результате. –

2
$string = "The text you want to filter goes here. http://google.com, 
https://www.youtube.com/watch?v=K_m7NEDMrV0,https://instagram.com/hellow/"; 

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

echo "<pre>"; $arr = explode(",", $match[0][1]); 
print_r($match[0][0]); print_r($arr); echo "</pre>"; 
Смежные вопросы