preg_replace und Backreferences Problem

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • preg_replace und Backreferences Problem

    Ich hab den hier schonmal geposteten URL Parser (versucht) um die option zu erweitern, das er die Links auch kürzt wenn wie länger als n Zeichen sind. Nur ich habe das problem das er die eingebettete Funktion schlichtweg ignoriert.

    $1 läuft ohne weiteres durch die funktion cuthyper() durch und die var in dieser funktion hat auch nur den inhalt "$1".

    Normalerweise sollte doch anstatt $1, der aus der klammer enstehende String der funktion cuthyper() übergeben werden. oder seh ich das falsch?

    Klärt mich auf *hilfe* such schon voll ewig nach ner lösung.

    hier mal mein code
    PHP-Code:
    echo parseHyper("blabla [url]http://hallodoofesubdomain.domain.de/dasisjanentollesverzeichnis/undsoeineschoooeeeenneeedatei.html[/url] nochmehr blabla",1);

    function 
    parseHyper($string,$cut="0"
        {
            
    $search = array(
              
    "/([\w\.\/\&\=\?\-]+)@([\w\.\/\&\=\?\-]+)/",     // eMail
              
    "/((ftp(7?):\/\/)|(ftp\.))([\w\.\/\&\=\?\-]+)/"// FTP
              
    "/((http(s?):\/\/)|(www\.))([\w\.\/\&\=\?\-]+)/" // HTTP
            
    );
            
    $replace = array (
              
    "<a href=\"mailto:$1@$2\">$1@$2</a>",                // eMail
              
    "<a href=\"ftp$3://$4$5\" target=\"_blank\">$4$5</a>"// FTP
              
    "<a href=\"http$3://$4$5\" target=\"_blank\">$4$5</a>" // HTTP
            
    );
            
    $string preg_replace ($search$replace$string);
            
    $string preg_replace ("/>(.*?)<\/a>/",">".cuthyper("$1",$cut)."</a>",$string);
            return 
    $string;
        }
        
    function 
    cuthyper($str,$cut=0)
    {
        if(
    $cut==&& strlen($str) >= 44){
            
    $sub1 substr($str,0,30);
            
    $sub2 substr($str,-10);
            
    $str sprintf("%s ... %s",$sub1,$sub2);
        }
        return 
    $str;

    Hoffe ihr könnt mir helfen
    Gruss, nik

  • #2
    preg_replace erwartet ein \1 als Referenz, nicht $1 wie ereg_replace
    TBT

    Die zwei wichtigsten Regeln für eine berufliche Karriere:
    1. Verrate niemals alles was du weißt!


    PHP 2 AllPatrizier II Browsergame

    Kommentar


    • #3
      Na ob das jetzt so richtig ist. Ich glaube die erste funktion parseHyper is so kaum verändert von Abraxas. Mein ich zumindest. ausserdem steht unter euren Tuts zu Regex auch $1 und nich \1... und wenn.... sollte das nicht \\1 sein? mein ich auch schon mal gelesen zu haben.

      $1 is meines wissen die neue syntax. \1 die alte.oder so

      Aber ich probiers einfach mal aus. vieleich hilfts ja doch.
      Danke, nik

      Kommentar


      • #4
        neeeee... mist. geht auch nicht. Gibbet noch andere Lösungen?
        Gruss nik

        Kommentar


        • #5
          Da ich nicht in Codes rumfriemeln will, poste ich einfach einen Code-Schnipsel aus einem meiner Projekte:

          PHP-Code:
          function direct_linker ($f_type,$f_data)
          {
           global 
          $direct_cachedata,$direct_checkdata,$direct_flevel,$direct_globaldata,$direct_tempdata,$direct_local,$direct_userdata,$mainscript;

           if (
          $f_type == "cache"):
           {
            if (
          $f_data != "") { $f_data str_replace ("%2F",";",(urlencode ($f_data))); }
            
          $f_return $direct_globaldata['iscript_url']."s=bi&f=cache&dsd=$f_data&theme=$direct_cachedata[theme]&lang=$direct_cachedata[lang]&uuid=".$direct_cachedata['uuid'];
           }
           elseif (
          $f_type == "form"):
           {
            
          $direct_flevel++;

            
          $direct_tempdata[$direct_flevel."1array"] = explode ("&",$f_data);
            
          $f_return "";
             
            foreach (
          $direct_tempdata[$direct_flevel."1array"] as $direct_tempdata[$direct_flevel."1string"])
            {
             if (
          $direct_tempdata[$direct_flevel."1string"] != "")
             {
              
          $direct_tempdata[$direct_flevel."2array"] = explode ("=",$direct_tempdata[$direct_flevel."1string"]);
              if (
          $direct_tempdata[$direct_flevel."2array"][0] != "") { $f_return .= "<input type='hidden' name='".$direct_tempdata[$direct_flevel."2array"][0]."' value='".$direct_tempdata[$direct_flevel."2array"][1]."' />"; }
             }
            }

            
          $f_return .= "<input type='hidden' name='theme' value='$direct_cachedata[theme]' /><input type='hidden' name='lang' value='$direct_cachedata[lang]' /><input type='hidden' name='uuid' value='$direct_cachedata[uuid]' />";

            
          $direct_flevel--;
           }
           elseif (
          $f_type == "optical"):
           {
            if ((!@
          is_integer ($direct_globaldata['default_url_opticalmaxlength']))||($direct_globaldata['default_url_opticalmaxlength'] < 1)) { $direct_globaldata['default_url_opticalmaxlength'] = 100; }

            if (
          strlen ($f_data) > $direct_globaldata['default_url_opticalmaxlength'])
            {
             
          $direct_flevel++;

             
          // Anfrage mit Query-String
             
          if (preg_match ("#^(.*?)(/|)(\w{1,})\.(\w{1,})\?(.*?)$#i",$f_data,$direct_tempdata[$direct_flevel."1array"]))
             {
              
          $direct_tempdata[$direct_flevel."1string"] = ($direct_globaldata['default_url_opticalmaxlength'] - strlen ($direct_tempdata[$direct_flevel."1array"][2]) - strlen ($direct_tempdata[$direct_flevel."1array"][4]));

              
          $direct_tempdata[$direct_flevel."4string"] = floor (($direct_tempdata[$direct_flevel."1string"] - 3) / 8);
              
          $direct_tempdata[$direct_flevel."3string"] = ($direct_tempdata[$direct_flevel."4string"] * 2);
              
          $direct_tempdata[$direct_flevel."2string"] = ($direct_tempdata[$direct_flevel."1string"] - ($direct_tempdata[$direct_flevel."3string"] * 2) - $direct_tempdata[$direct_flevel."4string"]);

              
          // Host + Verzeichnis
              
          if (strlen ($direct_tempdata[$direct_flevel."1array"][1]) < ($direct_tempdata[$direct_flevel."2string"] + $direct_tempdata[$direct_flevel."4string"]))
              {
               
          $f_return $direct_tempdata[$direct_flevel."1array"][1];
               
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][1]);
              }
              else
              {
               
          $f_return = (substr ($direct_tempdata[$direct_flevel."1array"][1],0,$direct_tempdata[$direct_flevel."2string"]))."...".(substr ($direct_tempdata[$direct_flevel."1array"][1],(-$direct_tempdata[$direct_flevel."4string"])));
               
          $direct_tempdata[$direct_flevel."1string"] -= ($direct_tempdata[$direct_flevel."2string"] + $direct_tempdata[$direct_flevel."4string"]);
              }

              
          // Mögliche Verzeichnistrennung "/"
              
          $f_return .= $direct_tempdata[$direct_flevel."1array"][2];
              
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][2]);

              
          // Dateiname
              
          if (strlen ($direct_tempdata[$direct_flevel."1array"][3]) < ($direct_tempdata[$direct_flevel."3string"]))
              {
               
          $f_return .= $direct_tempdata[$direct_flevel."1array"][3];
               
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][3]);
              }
              else
              {
               
          $f_return .= "...".(substr ($direct_tempdata[$direct_flevel."1array"][3],(-$direct_tempdata[$direct_flevel."3string"])));
               
          $direct_tempdata[$direct_flevel."1string"] -= ($direct_tempdata[$direct_flevel."3string"]);
              }

              
          // Dateiendung
              
          $f_return .= ".".$direct_tempdata[$direct_flevel."1array"][4]."?";
              
          $direct_tempdata[$direct_flevel."1string"] -= (+ (strlen ($direct_tempdata[$direct_flevel."1array"][4])));

              
          // Get-Query
              
          if (strlen ($direct_tempdata[$direct_flevel."1array"][5]) < ($direct_tempdata[$direct_flevel."1string"])) { $f_return .= $direct_tempdata[$direct_flevel."1array"][5]; }
              else { 
          $f_return .= "...".(substr ($direct_tempdata[$direct_flevel."1array"][5],(-$direct_tempdata[$direct_flevel."1string"]))); }
             }
             
          // Anfrage ohne Query-String
             
          else
             {
              
          preg_match ("#^(.*?)(/|)(\w{1,})(\.|/|)(\w{1,})$#i",$f_data,$direct_tempdata[$direct_flevel."1array"]);

              
          $direct_tempdata[$direct_flevel."1string"] = ($direct_globaldata['default_url_opticalmaxlength'] - strlen ($direct_tempdata[$direct_flevel."1array"][2]) - strlen ($direct_tempdata[$direct_flevel."1array"][4]) - strlen ($direct_tempdata[$direct_flevel."1array"][5]));
              
          $direct_tempdata[$direct_flevel."4string"] = floor ($direct_tempdata[$direct_flevel."1string"] / 6);
              
          $direct_tempdata[$direct_flevel."3string"] = ($direct_tempdata[$direct_flevel."4string"] * 2);
              
          $direct_tempdata[$direct_flevel."2string"] = ($direct_tempdata[$direct_flevel."1string"] - $direct_tempdata[$direct_flevel."3string"] - $direct_tempdata[$direct_flevel."4string"]);

              
          // Host + Verzeichnis
              
          if (strlen ($direct_tempdata[$direct_flevel."1array"][1]) < ($direct_tempdata[$direct_flevel."2string"] + $direct_tempdata[$direct_flevel."4string"]))
              {
               
          $f_return $direct_tempdata[$direct_flevel."1array"][1];
               
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][1]);
              }
              else
              {
               
          $f_return = (substr ($direct_tempdata[$direct_flevel."1array"][1],0,$direct_tempdata[$direct_flevel."2string"]))."...".(substr ($direct_tempdata[$direct_flevel."1array"][1],(-$direct_tempdata[$direct_flevel."4string"])));
               
          $direct_tempdata[$direct_flevel."1string"] -= ($direct_tempdata[$direct_flevel."2string"] + $direct_tempdata[$direct_flevel."4string"]);
              }

              
          // Mögliche Verzeichnistrennung "/"
              
          $f_return .= $direct_tempdata[$direct_flevel."1array"][2];
              
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][2]);
              
          $direct_tempdata[$direct_flevel."1string"] -= strlen ($direct_tempdata[$direct_flevel."1array"][4].$direct_tempdata[$direct_flevel."1array"][5]);

              
          // Dateiname
              
          if (strlen ($direct_tempdata[$direct_flevel."1array"][3]) < ($direct_tempdata[$direct_flevel."1string"])) { $f_return .= $direct_tempdata[$direct_flevel."1array"][3]; }
              else { 
          $f_return .= "...".(substr ($direct_tempdata[$direct_flevel."1array"][3],(-$direct_tempdata[$direct_flevel."1string"]))); }

              
          // Dateiendung
              
          $f_return .= $direct_tempdata[$direct_flevel."1array"][4].$direct_tempdata[$direct_flevel."1array"][5];
             }

             
          $direct_flevel--;
            }
            else { 
          $f_return $f_data; }
           }
           elseif (
          $f_type == "url2"):
           {
            if (
          $f_data != "") { $f_data .= "&"; }
            
          $f_return $direct_globaldata['sysurl']."/$direct_globaldata[ios_script]?".$f_data."theme=$direct_cachedata[theme]&lang=$direct_cachedata[lang]&uuid=".$direct_cachedata['uuid'];
           }
           elseif (
          $f_type == "url1"):
           {
            if (
          $f_data != "") { $f_data .= "&"; }
            
          $f_return $direct_globaldata['ios_script']."?".$f_data."theme=$direct_cachedata[theme]&lang=$direct_cachedata[lang]&uuid=".$direct_cachedata['uuid'];
           }
           else:
           {
            if (
          $f_data != "") { $f_data .= "&"; }
            
          $f_return $direct_globaldata['iscript_url'].$f_data."theme=$direct_cachedata[theme]&lang=$direct_cachedata[lang]&uuid=".$direct_cachedata['uuid'];
           }
           endif;

           return 
          $f_return;

          Die komplette Funktion dient dem verschiedenen Verlinken von Daten. Du musst dir das ganze also an deine Bedürfnisse anpassen, wenn du es nutzen willst.

          Relevant ist hierbei hauptsächlich alles nach der Zeile:
          ($f_type == "optical")
          Eventuelle Tippfehler bei PHP-Beispielen können durchaus vorkommen, aber es geht um die grundsätzliche Möglichkeit der Anwendung.

          Es war einmal ein Benutzer, der hatte ein Problem mit ... PHP (http://de3.php.net/manual/de/) MySQL (http://dev.mysql.com/doc/mysql/de/) HTML (http://www.selfhtml.org/)

          Wer suchet, der findet: http://www.php-resource.de/forum/search.php
          Immer noch nichts? Dann frag!


          Mit freundlichen Grüßen,
          @4u

          Kommentar


          • #6
            ach du draht. Was is das denn?????? Was macht diese gewaltsfunktion eigentlich genau ???

            Kommentar


            • #7
              Setzt verschiede Links um, prüft URLs auf ihre Länge und schneidet diese, wenn sie zu lang sind, zurecht. Dabei beachtet die Funktion, ob Query Strings vorhanden sind, oder nicht.
              Eventuelle Tippfehler bei PHP-Beispielen können durchaus vorkommen, aber es geht um die grundsätzliche Möglichkeit der Anwendung.

              Es war einmal ein Benutzer, der hatte ein Problem mit ... PHP (http://de3.php.net/manual/de/) MySQL (http://dev.mysql.com/doc/mysql/de/) HTML (http://www.selfhtml.org/)

              Wer suchet, der findet: http://www.php-resource.de/forum/search.php
              Immer noch nichts? Dann frag!


              Mit freundlichen Grüßen,
              @4u

              Kommentar


              • #8
                Ist das nicht ein wenig üppig?
                Ich denke die funktionen,die ich geposted habe,können das auch =) Auch querystrings werden berücksichtigt. Ich hab aber halt nur das Problem das ich den gefundenen string nicht an die cuthyper übergeben bekomm.

                Kommentar


                • #9
                  Soooooooooo *Freu* ich habs dann doch endlich geschafft. Falls noch wer dieses Prob hat hier mal den endgültigen Quelltext.

                  Bis dann, nik

                  PHP-Code:
                  function parseHyper($string,$cut="0"
                      {
                          
                  $search = array(
                            
                  "/([\w\.\/\&\=\?\-]+)@([\w\.\/\&\=\?\-]+)/",     // eMail
                            
                  "/((ftp(7?):\/\/)|(ftp\.))([\w\.\/\&\=\?\-]+)/"// FTP
                            
                  "/((http(s?):\/\/)|(www\.))([\w\.\/\&\=\?\-]+)/" // HTTP
                          
                  );
                          
                  $replace = array (
                            
                  "<a href=\"mailto:$1@$2\">$1@$2</a>",                // eMail
                            
                  "<a href=\"ftp$3://$4$5\" target=\"_blank\">$4$5</a>"// FTP
                            
                  "<a href=\"http$3://$4$5\" target=\"_blank\">$4$5</a>" // HTTP
                          
                  );
                          
                  $string preg_replace ($search$replace$string);
                          if(
                  $cut == 1$string preg_replace ("/>(.*)?<\/a>/ie","'>'.cuthyper('\\\\1').'</a>'",$string);
                          return 
                  $string;
                      }
                      
                  function 
                  cuthyper($str,$cut=0)
                  {
                      if(
                  strlen($str) >= 44){
                          
                  $sub1 substr($str,0,30);
                          
                  $sub2 substr($str,-10);
                          
                  $str sprintf("%s ... %s",$sub1,$sub2);
                      }
                      return 
                  $str;


                  Ach ja... anstatt von \\1 kann man auch $1 nehmen. geht beides =)
                  Zuletzt geändert von niknormal; 30.05.2003, 17:50.

                  Kommentar

                  Lädt...
                  X