Phil: preg_replace und parse_url

Hallo zusammen

Ich versuche verzweifelt folgenden Code zum laufen zu bringen:

  
$text = preg_replace("!(^|[^\"=]{1})(http://|ftp://|mailto:|https://)([^\s<>]+)([\s\n<>]|$)!sme", "'\\1<a href=\"\\2\\3\" target=\"_blank\">" . parse_url('\\2\\3', PHP_URL_HOST) . "</a>\\4'", $zeile->text);  

Mein Ziel ist es, die Links in einen Text anklickbar zu machen. Allerdings soll der angezeigte Link-Text anders lauten als der eigentliche Link. Sowas in der Richtung:

Text:
Auf http://www.xxx.de/test.zip gibt es gratis...

Daraus soll preg_replace machen.
Auf <a href="http://www.xxx.de/test.zip">xxx.de</a> gibt es gratis..

Vielen Dank für Eure Hilfe.

  1. Oh entschuldigt bitte. Das Problem besteht darin, dass wohl die Links im Quelltext ausgewechselt werden, allerdings wird der parse_url Teil nicht für den Benutzer angezeigt. Dieser bleibt leer. Es scheint mir so als würde \2\3 bei parse_url nicht funktionieren.

  2. Hi,

    Ich versuche verzweifelt folgenden Code zum laufen zu bringen:

    $text = preg_replace("!(^|[^"=]{1})(http://|ftp://|mailto:|https://)([^\s<>]+)([\s\n<>]|$)!sme", "'\1<a href="\2\3" target="_blank">" . parse_url('\2\3', PHP_URL_HOST) . "</a>\4'", $zeile->text);

      
    Quote Manual: “Make sure you are aware of PHP's string syntax to know exactly how the interpreted string will look.”  
      
    Du willst nicht den äußeren String vor parse\_url beenden (und dahinter fortsetzen), sondern den inneren.  
    Und dann willst du die Anführungszeichen im ersten Argument von parse\_url entweder escapen, um den äußeren String nicht kaputt zu machen, oder dort Hochkommata nutzen.  
      
    `$text = preg_replace("!(^|[^\"=]{1})(http://|ftp://|mailto:|https://)([^\s<>]+)([\s\n<>]|$)!sme", "'\\1<a href=\"\\2\\3\" target=\"_blank\">' . parse_url('\\2\\3', PHP_URL_HOST) . '</a>\\4'", 'Auf http://www.xxx.de/test.zip gibt es gratis...');`{:.language-php}  
      
    MfG ChrisB  
      
    
    -- 
    RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
    
    1. Hi,

      Und dann willst du die Anführungszeichen im ersten Argument von parse_url entweder escapen, um den äußeren String nicht kaputt zu machen, oder dort Hochkommata nutzen.

      Oh, streiche das - da hattest du im Originalcode ja gar keine.

      MfG ChrisB

      --
      RGB is totally confusing - I mean, at least #C0FFEE should be brown, right?
  3. Hi!

    $text = preg_replace("!(^|[^"=]{1})(http://|ftp://|mailto:|https://)([^\s<>]+)([\s\n<>]|$)!sme", "'\1<a href="\2\3" target="_blank">" . parse_url('\2\3', PHP_URL_HOST) . "</a>\4'", $zeile->text);

      
    Du hast also ungefähr so etwas notiert: foo(argument1, argument2, argument3); Und du meinst, das erste und dritte Argument wird sofort ausgewertet und an foo() übergeben und das zweite erst während foo() seine Arbeit macht? Nach welchem logischen Prinzip soll denn diese ungleiche Behandlung der Argumente passieren?  
      
    Schau dir [preg_replace_callback()](http://de.php.net/manual/en/function.preg-replace-callback.php) an.  
      
      
    Lo!