Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > Найти, вырезать и дополнить УРЛы из текста


Автор: Wowa 26.3.2005, 14:29
Есть текст. В нем есть адреса страниц в перемешку с пробелами переводами строк. Может запятыми еще... или ;

Нужно найти все адреса веб-страниц, которые в этом тексте есть.
Если адрес написан без http, то дополнить его прибавление спереди http://
Затем все собранные и дополненные адреса запихнуть в массив.

Автор: Irokez 26.3.2005, 14:50
preg_match_all?

Автор: Wowa 26.3.2005, 15:11
Цитата(Irokez @ 26.3.2005, 12:50)
preg_match_all?

Да. А какой регексп?

Автор: IZ@TOP 26.3.2005, 15:58
Admin, ну может это поможет:

Код

<pre>
<?php

$text = "Hello !!!! whrglkjwer erw hgweuig iul h gerui t348yv9 b823y590q971t-90 ADSL;

FWERKKTN V3WG4VM90 
]
http://www.agava.com/?sn=6&f9034%20&fek=//\3mainp_--32480=
+12

";

preg_match_all("%(http://[^ ]*)%si", $text, $m);

print_r($m);

?></pre>

Автор: Wowa 26.3.2005, 16:06
IZ@TOP спасибо. Поможет, но частично только. Т.к. урлы в тексте могут быть без http и по идее, даже без www.

Автор: IZ@TOP 26.3.2005, 16:15
Admin, что то мне подсказывает что это будет очень сложно реализовать. Даже при постановке вопроса что в урл может быть знак переноса строки, вдруг после переноса будет простой текст? Получиться что он станет частью урла.
Добавлено @ 16:17
Еще есть такой вариант:

Код

<pre>
<?php

$text = "Hello !!!! whrglkjwer erw hgweuig iul h gerui t348yv9 b823y590q971t-90 ADSL;

FWERKKTN V3WG4VM90 
]
http://www.agava.com/?sn=6&f9034%20&fek=//\3mainp_--32480=
+12
 
ppp.com.ru/

";

preg_match_all("%([a-z0-9\.\-]{2,}\.[a-z]{2,4}[^ ]*)%si", $text, $m);

print_r($m);

?></pre>

Добавлено @ 16:18
Цитата
Array
(
    [0] => Array
        (
            [0] => www.agava.com/?sn=6&f9034%20&fek=//mainp_--32480=
+12

            [1] => ppp.com.ru/


        )

    [1] => Array
        (
            [0] => www.agava.com/?sn=6&f9034%20&fek=//mainp_--32480=
+12

            [1] => ppp.com.ru/


        )

)

Автор: Mal Hack 26.3.2005, 19:45
Получаем из текста все URL'ы

Вариант 1. Получаем все URL'ы, в виде http://somedomain.com или somedomain.com. При этом мы сразу осуществляем проверку на их правильность.
Код
<?php

if( preg_match_all( "#(((http|ftp|https):\/\/)|\s)((\w|\d){1,}(\-|\.){0,1}(\w|\d){1,})+?\.(\w){2,4}\/*\s#i" , $text , $matches ) )
  {  print_r ( $matches[0] );  }
else
  {  print "No urls found.";  }

?>


Вариант 2. Получаем все URL'ы, с параметрами и без (т.е. с QUERY_STRING), но при этом не проверяем правильность QUERY_STRING. Тут же мы сможем получить URL'ы с каталогами, т.е. /news/12/12/2003/index.html, опять же без проверки оных.
Код
<?php

if( preg_match_all( "#(((http|ftp|https):\/\/)|\s)((\w|\d){1,}(\-|\.){0,1}(\w|\d){1,})+?\.(\w){2,4}.*?\s#i" , $text , $matches ) )
  {  print_r ( $matches[0] );  }
else
  {  print "No urls found.";  }

?>


Вариант 3. Самый простой, без любых проверок
Код
<?php

if( preg_match_all( "#(((http|ftp|https):\/\/)|\s).*?\s#i" , $text , $matches ) )
  {  print_r ( $matches[0] );  }
else
  {  print "No urls found.";  }

?>


Единственно что \w\d в целях безопасносии надо на [A-Z0-9] заменить ну и скобок меньше.

Автор: CyClon 18.2.2006, 21:31
Все урлы читать справа налево и смотреть, есть ли . (точка) справа, т.е. до 4 символов. Может конечно и справа налево можно. Но других варантов нету помоему, ведь PHP - не ИИ.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)