[php] Wyciąganie adresów www z tekstu


(Michael) #1

Mam pewną zmienną z tekstem w którym znajdują się adresy stron www. Chciałbym żeby jakaś funkcja zapisała mi wszystkie adresy stron do tablicy. np.

$text="Jakiś tam tekst http://www.wp.pl/Jakiś tam tekst Jakiś tam tekst Jakiś tam tekst http://forum.dobreprogramy.pl/ tekst http://dobreprogramy.pl/";

i żeby mi zapisało do tablicy np. $adresy:

$adresy[0]="http://www.wp.pl";

$adresy[1]="http://forum.dobreprogramy.pl/";

$adresy[2]="http://dobreprogramy.pl/";

Oczywiście wszystko żeby było w PHP :stuck_out_tongue: może jakieś nakierowanie na funkcję? Z góry dzięki :slight_smile:


(Airborn) #2

wyrażenia regularne :wink: moim zdaniem kombinuj z preg_split() albo podobną


(mrbungle) #3

mozna wyrazeniem regularnym, ale wiele osob ktore maja z tym problemy... naet ja :stuck_out_tongue:

dlatego zeby poćwiczyć PHP napisąłem sobie taką funkcję:

function getUrlFromText($text)

	{

		$urls = array();


		$j = -1;


		// dopoki sa adresy w tekscie

		while(($i = strpos($text, 'http://', $j+1)) !== false)

		{

			// szukamy spacji jako znaku wyrozniajacego URL z tekstu

			if(($j = strpos($text, ' ', $i)) === false)

				$j = strlen($text);


			$temp = substr($text, $i, $j-$i);


			array_push($urls, $temp);

		}


		return($urls);

	}


	$text="Jakiś tam tekst http://www.wp.pl/ Jakiś tam tekst Jakiś tam tekst Jakiś tam tekst http://forum.dobreprogramy.pl/ tekst http://dobreprogramy.pl/";

	$url = getUrlFromText($text);


	echo '

';

	print_r($url);

	echo '

';[/code] efekt? prosze bardzo:
[code]Array ( [0] => http://www.wp.pl [1] => http://forum.dobreprogramy.pl [2] => http://dobreprogramy.pl )


(Kubarek) #4

ze źródeł coyote:

/*

 * Funkcja powoduje automatyczne nadawnie znacznika URL'a oraz adresom e-mail

 */

function url()

      {

          /* tablice statyczne */

          static $patterns = array();

          static $replacements = array();

          /* Automatyczne wykrywanie URL i adresow e-mail */


          if ( !$patterns )

          {

              //linki z protokolem [np. http://cos.pl, ftp://cos.pl]

// $patterns[] = '#(^|[\n]|\()([\w]+:/{2}.*?(?:[^ \t\n\r<"\'\)&]+|&(?!lt;))*)#ie'; //bug #230

              $patterns[] = '#(?:^|(?<=[][()<>\s]|>|<))(\w+:/{2}.*?(?:[^][\t\n\r<>")&,\']+|&(?!lt;|gt;)|,(?!\s)|\[])*)#ie';

              $replacements[] = "'' . cut_url('$1', 70) . ''";


              //linki bez protokolu, z 'www' na poczatku

// $patterns[] = '#(^|[\n]|\()(w{3}\.[\w\-]+\.[\w\-.\~]+(?:[^ \t\n\r<"\'\)&]+|&(?!lt;))*)#ie'; //bug #230

              $patterns[] = '#(?:^|(?<=[][()<>"\'\s]|>|<))(w{3}\.[\w-]+\.[\w.~-]+(?:[^][\t\n\r<>")&,\']+|&(?!lt;|gt;)|,(?!\s)|\[])*)#ie';

              $replacements[] = "'' . cut_url('$1', 70) . ''";


// $patterns[] = "@\b(?:(http(?:s)?://|ftp://)|(www\.))([a-z0-9_-]+(?:(?:/|\.)[][(){}^/$,?+#*:;%~=&a-z0-9ąćęłńóśźżĄĆĘŁŃÓŚŹŻ_-]+)+)@ie";

// $replacements[] = "'' . cut_url('\`\\2\\3', 70) . '\n\n'";


              //adresy e-mail

              $patterns[] = '#(^|[\n]|\()([a-z0-9&\-_.]+?@[\w\-]+\.(?:[\w\-\.]+\.)?[\w]+)#i';

              $replacements[] = "\$1$2";

          }


          $this->text = preg_replace($patterns, $replacements, $this->text);

      }[/code]

(Michael) #5

mrbungle dzięki :slight_smile: ja myślałem nad tym żeby zrobić z tekstu tablice po spacjach (explode) i pokolei sprawdzać pozycje z tablicy czy zaczyna sie od http/www i dodawać do nowej tablicy :stuck_out_tongue: ale uznałem to za lamerski sposób i sie spytałem:P