john: URLs auslesen und mit bit.ly kürzen

Hallo.

Derzeit werden meine URLs in user-generierten Texten in der DB gespeichert und bei der Ausgabe wird der Text durch folgende Funktion gejagt:

public static function make_clickable($text){  
		// pad it with a space so we can match things at the start of the 1st line.  
		$ret = ' '.$text;  
		// matches an "xxxx://yyyy" URL at the start of a line, or after a space.  
		// xxxx can only be alpha characters.  
		// yyyy is anything up to the first space, newline, comma, double quote or <  
		$ret = preg_replace("#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is", "\\1<a href=\"\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>", $ret);  
		// matches a "www|ftp.xxxx.yyyy[/zzzz]" kinda lazy URL thing  
		// Must contain at least 2 dots. xxxx contains either alphanum, or "-"  
		// zzzz is optional.. will contain everything up to the first space, newline,  
		// comma, double quote or <.  
		$ret = preg_replace("#(^|[\n ])((www|ftp)\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\t\n\r<]*)?)#is", "\\1<a href=\"http://\\2\" target=\"_blank\" rel=\"nofollow\">\\2</a>", $ret);  
		// matches an email@domain type address at the start of a line, or after a space.  
		// Note: Only the followed chars are valid; alphanums, "-", "_" and or ".".  
		$ret = preg_replace("#(^|[\n ])([a-z0-9&\-_.]+?)@([\w\-]+\.([\w\-\.]+\.)*[\w]+)#i", "\\1<a href=\"mailto:\\2@\\3\" rel=\"nofollow\">\\2@\\3</a>", $ret);  
		// Remove our padding..  
		$ret = substr($ret, 1);  
		return $ret;  
	}

Funktioniert prima, sorgt aber für unnötigen Rechenaufwand.
Ich möchte das die Texte vor dem Abspeichern in der DB schon auf URLs überprüft werden und mit der API von bit.ly gekürzt werden (wie Twitter das macht), anschließend muss der Text vor der Ausgabe nur noch nach genau "bit.ly" Links durchsucht werden.

Ich will also 1. die URLs extrahieren und durch die API jagen und 2. bei der Ausgabe nach bit.ly Urls durchsuchen:  z.B. http://bit.ly/doUEZV
bzw.  http://bit.ly/HASH
Wie stelle ich das an?

Lg, john

  1. Warum verschleiern grad alle ihre Links? Versteh ich nicht, da weiß dann keiner mehr wo er wirklich landet wenn er klickt. Muss das sein?
    Zusammen mit der steigenden Überwachung seitens des Staats dürfte das einen wenig erwünschten Effekt haben.

    1. Hi!

      Warum verschleiern grad alle ihre Links? Versteh ich nicht, da weiß dann keiner mehr wo er wirklich landet wenn er klickt. Muss das sein?

      http://example.com/links-werden-wegen-seo-immer-länger-und-können-nicht-mehr-getwittert-werden/darum-verkürzt-man-sie-nun-wieder

      Lo!

    2. Vor allem tut man das um Link-Spamming zu verhindern.
      Viele Leute ollen die "Sichtbarkeit" ihrer URL für die Suchmaschinen erhöhen und spammen deshalb Foren zu.

  2. Könnte mir jemand helfen?
    Was ist an meinem Posting unverständlich. Wäre nett wenn ihr das sagen könntet dann verbessere ich mich gerne.

    1. Hi!

      Was ist an meinem Posting unverständlich. Wäre nett wenn ihr das sagen könntet dann verbessere ich mich gerne.

      Unverständlich ist, wobei du konkret Verständnisprobleme hast.

      Ich will also 1. die URLs extrahieren und durch die API jagen und 2. bei der Ausgabe nach bit.ly Urls durchsuchen:  z.B. http://bit.ly/doUEZV
      bzw.  http://bit.ly/HASH
      Wie stelle ich das an?

      Dumm geantwortet: Indem du es programmierst.

      Du hast bereits die Muster, um die Langen URLs zu extrahieren. (Allerdings hast du auch eins, das nach Mailadressen sucht. Willst du die auch bitlysieren?) Momentan tauschst du die extrahierte Adresse in ein a-Element ein. Du brauchst jedoch als Zwischenschritt die bitly-Adresse. Ein preg_replace_callback() bietet sich an. In der Callback-Funktion kannst du die Programmierung für das Holen der bitly-Adresse unterbringen. Für die Ausgabe musst du das vorhandene Muster zusammenstreichen oder ein neues erstellen, das auf die bitlys angepasst ist.

      Lo!

      1. Ich will also 1. die URLs extrahieren und durch die API jagen und 2. bei der Ausgabe nach bit.ly Urls durchsuchen:  z.B. http://bit.ly/doUEZV
        bzw.  http://bit.ly/HASH
        Wie stelle ich das an?

        Dumm geantwortet: Indem du es programmierst.

        Wie kann ich denn bei Preg_match einen string zwischen setzen, nachträglich??

        1. Hi!

          Wie kann ich denn bei Preg_match einen string zwischen setzen, nachträglich??

          preg_match() prüft nur auf ein bestimmtes Muster. preg_replace() und preg_replace_callback() sind vorgesehen zum Erzeugen eines neuen String unter Berücksichtigung und Einbeziehung des Musters.

          Lo!

          1. preg_match() prüft nur auf ein bestimmtes Muster. preg_replace() und preg_replace_callback() sind vorgesehen zum Erzeugen eines neuen String unter Berücksichtigung und Einbeziehung des Musters.

            Es tut mir Leid aber ich bekomme es nicht hin:

            Ich habe nun eine kleine Funktion geschrieben:

            private function _bitly($t){  
            		$b=new Scripts_bitly('xxx','R_52686084ac7e4ef6d3b8036166a2a70c');  
            		$url=preg_replace('"#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is"',$b->shorten(preg_replace_callback('"#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is"',$t)),$t);  
            		return preg_replace("#(^|[\n ])((www|ftp)\.[\w\-]+\.[\w\-.\~]+(?:/[^ \"\t\n\r<]*)?)#is",$b->shorten(preg_replace_callback('"#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is"',$url)),$url);  
            	}
            

            Lg, Phil

            1. Hi!

              Es tut mir Leid aber ich bekomme es nicht hin:
              $url=preg_replace('"#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is"',$b->shorten(preg_replace_callback('"#(^|[\n ])([\w]+?://.*?[^ \"\n\r\t<]*)#is"',$t)),$t);

              Du schachtelst hier wild Dinge ineinander. Hast du dir mal die Beschreibungen inklusive der Anwendungsbeispiele der Funktionen im Handbuch angeschaut?

              Wenn du foo(bar(42)) schreibst, wird zuerst bar(42) ausgeführt und das Ergebnis davon bildet den Parameterwert für foo().
              Warum rahmst du das Muster noch einmal in '' ein, obwohl es schon in "" steht? Die "" sind damit Bestandteil des Musterstrings. Die äußeren Zeichen eines Musters sind die Musterbegrenzer. Die "" sind also die Musterbegrenzer und das # am Anfang sowie das #is am Ende sind nun normale Zeichen innerhalb des Musters.

              Bitte schau dir die Grundlagen an und probiere nicht einfach sinnlos drauf los. Ich werde bei Verständnisproblemen helfen, aber nicht einfach so die Lösung aufschreiben.

              Lo!