URL's ersetzen

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

  • URL's ersetzen

    Okay, ich hab mal wieder eine Blockade und komm einfach nicht auf die Lösung.
    Folgendes Problem:
    Ich möchte in einem Text alle URL's, die folgenden Aufbau besitzen:
    HTML-Code:
    <a href="/pfad-der-daten/hersteller/produkt/id.html">
    durch folgende URL's:
    HTML-Code:
    <a href="/hersteller-produkt/id/
    ersetzen.

    Nun habe ich das mit folgendem Konstrukt gelöst (dachte ich):
    PHP-Code:
    $text preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html#'$neuer_link$text); 
    Ich dachte: juhu, das wars, funktioniert. Allerdings werden verschiedene Hersteller bzw. Produkte immer durch den jeweils ersten Link überschrieben. Beispiel:
    HTML-Code:
    <a href="/pfad-der-daten/hersteller1/produkt50/5001.html">
    <a href="/pfad-der-daten/hersteller2/produkt30/2005.html">
    <a href="/pfad-der-daten/hersteller3/produkt26/2895.html">
    Diese Links werden alle durch folgenden Link ersetzt:
    HTML-Code:
    <a href="/hersteller1-produkt50/5001/">
    Wo liegt mein Denkfehler und wie kann ich das Problem lösen?
    Das Genie überblickt das Chaos!

    Wer Rechtschreibfehler findet, darf sie behalten!

  • #2
    Hallo,

    wie lautet der Inhalt von $neuer_link?

    Gruß,

    Amica
    [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
    Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
    Super, danke!
    [/COLOR]

    Kommentar


    • #3
      PHP-Code:
              if ( ereg '\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html'$text$regs ) )
              {
                  
      $query mysql_query("SELECT * FROM `tabelle` WHERE `id`='".$regs[4]."'");
                  
      $row   mysql_fetch_array($query);
                  
      $id                   $row['id'];
                  
      $hersteller_link       str_replace(' ''-'$row['hersteller']);
                  
      $produkt_link           str_replace(' ''-'$row['produkt']);
                  
      $hersteller_link       strtolower($hersteller_link);
                  
      $produkt_link           strtolower($produkt_link);
                  
      $neuer_link "/".$hersteller_link."-".$produktl_link."/".$id."/";
                  
      $message preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([0-9]{1,4}).html#'$neuer_link$text);
              } 
      Zuletzt geändert von chefdesigner; 02.10.2009, 14:28.
      Das Genie überblickt das Chaos!

      Wer Rechtschreibfehler findet, darf sie behalten!

      Kommentar


      • #4
        Achso, der RegExp passt auf alle URLs, aber du willst ja pro Datensatz nur eine ersetzen. Nach der ersten Row sind aber alle ersetzt und dann passt dafür der Suchausdruck nicht mehr, weil eine Verzeichnisebene weniger da ist. Warum nimmst du denn überhaupt preg_replace? Wenn dir die ganzen Namen und Nummern aus der DB bekannt sind, kannst du doch direkt mit str_replace ersetzen. Oder du machst es ohne DB und ersetzt mit Backreferences.
        [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
        Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
        Super, danke!
        [/COLOR]

        Kommentar


        • #5
          @AmicaNoctis:
          Ich hätte es nicht treffender formulieren können. Genau das ist mein Problem.

          Ich fürchte ich steh gerade tierisch auf dem Schlauch, das Ganze nervt mich nun schon Stunden. Könntest du mir bitte einen Tipp geben, wie du das machen würdest. Ich wollte halt nicht alle 50 (oder mehr) Hersteller etc. aufzählen.

          Wäre dir für nen Tipp sehr dankbar.
          Das Genie überblickt das Chaos!

          Wer Rechtschreibfehler findet, darf sie behalten!

          Kommentar


          • #6
            Da wären noch ein paar Fragen zu klären: gibt es in der Seite auch Links, die nicht ersetzt werden dürfen? Wenn ja, wie unterscheiden sich die konkret von den Produkt-URLs? Könnte man ohne Kenntnis der Datenbank nur aufgrund der alten URL die neue konstruieren oder würden dann Informationen fehlen? Fragst du die Datenbank nur für diese Ersetzungen ab oder benutzt du die Datensätze ohnehin in der Seite?
            [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
            Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
            Super, danke!
            [/COLOR]

            Kommentar


            • #7
              gibt es in der Seite auch Links, die nicht ersetzt werden dürfen?
              Ja, die gibt es. Es müssen einmal die oben erwähnten Links behandelt werden und zusätzlich noch folgende:
              .../hersteller1_produkte.html
              die in folgende Links geändert werden sollen:
              .../hersteller1-produkte/
              Ansonsten kommen auch noch andere Links vor, die alle ersatzlos gelöscht / durch nichts ersetzt werden sollen.

              Wenn ja, wie unterscheiden sich die konkret von den Produkt-URLs?
              Hmm, die haben einen anderen Aufbau, wie der aussieht kann ich nicht beschreiben, da es theoretisch externe Links sein können oder interne mit unterschiedlichstem Aufbau. -> sollen alle gelöscht werden

              Könnte man ohne Kenntnis der Datenbank nur aufgrund der alten URL die neue konstruieren oder würden dann Informationen fehlen?
              Wichtig ist eben die ID, anhand der man dann die neuen konstruieren könnte.

              Fragst du die Datenbank nur für diese Ersetzungen ab oder benutzt du die Datensätze ohnehin in der Seite?
              Eigentlich nur für die Ersetzung, da ich mich da nicht auf die alten Links "verlassen" will. Lediglich die ID ist 100% korrekt, der Rest könnte Fehler enthalten. Die neuen Links sollten also nicht auf Basis der alten umgeschrieben werden, sondern mit den Daten aus der Datenbank.
              Das Genie überblickt das Chaos!

              Wer Rechtschreibfehler findet, darf sie behalten!

              Kommentar


              • #8
                Zitat von chefdesigner Beitrag anzeigen
                Hmm, die haben einen anderen Aufbau, wie der aussieht kann ich nicht beschreiben, da es theoretisch externe Links sein können oder interne mit unterschiedlichstem Aufbau. -> sollen alle gelöscht werden
                Kann es passieren, dass externe Links auch auf eine existierende ID passen könnten?

                Beispiel:
                /pfad-der-daten/hersteller/produkt/53.html (ID = 53, wird ersetzt)
                /fiese_externe_URL/die_auch/passen_wuerde/53.html (genau gleiches Schema, soll aber nicht ersetzt werden)

                Edit: mir wird grad klar, dass ich totalen Blödsinn schreibe. Externe URLs würde man ja am http:// erkennen.

                Edit2:
                wie wäre es mit
                PHP-Code:
                $text preg_replace("!^/[^/]+/[^/]+/[^/]+/" $id "\.html$!"$neuer_link$text); 
                Zuletzt geändert von AmicaNoctis; 02.10.2009, 15:27.
                [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                Super, danke!
                [/COLOR]

                Kommentar


                • #9
                  Kann es passieren, dass externe Links auch auf eine existierende ID passen könnten?

                  Beispiel:
                  /pfad-der-daten/hersteller/produkt/53.html (ID = 53, wird ersetzt)
                  /fiese_externe_URL/die_auch/passen_wuerde/53.html (genau gleiches Schema, soll aber nicht ersetzt werden)

                  Edit: mir wird grad klar, dass ich totalen Blödsinn schreibe. Externe URLs würde man ja am http:// erkennen.
                  Genau, das könnte zwar passieren, kann man aber über das Abfragen der Domain abfangen.
                  Das Genie überblickt das Chaos!

                  Wer Rechtschreibfehler findet, darf sie behalten!

                  Kommentar


                  • #10
                    Boa, hatte nicht gesehen, dass du deinen Beitrag editiert hattest. ;-)

                    So, ich hab's ausprobiert, jetzt hab ich aber das Problem, dass er nur das erste vorkommen ersetzt und die anderen ignoriert?
                    Ich denke ich bräuchte da irgendwie ne Schleife, die ich dann über alle vorkommen drüber jage. Aber irgendwie hab ich grad ein Brett vor dem Kopf.

                    Könntest du mir noch nen Tipp geben?
                    Das Genie überblickt das Chaos!

                    Wer Rechtschreibfehler findet, darf sie behalten!

                    Kommentar


                    • #11
                      Natürlich brauchst du eine Schleife, sonst holst du ja nur den ersten Datensatz aus der Tabelle, üblicherweise sieht das so aus:

                      PHP-Code:
                      $query "select ...";
                      $result mysql_select($query$link);
                      while (
                      $row mysql_fetch_XXX($result)) {
                          
                      // mach was mit $row

                      Ersetze XXX durch assoc, object, array oder row. Je nachdem, aber assoc ist prima.
                      [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                      Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                      Super, danke!
                      [/COLOR]

                      Kommentar


                      • #12
                        Okay, vielen Dank für den Tipp. War Gold wert. Hatte echt ne Blockade. Manchmal ist die Lösung einfacher als man denkt.

                        Hier nun meine funktionierende Lösung:
                        PHP-Code:
                            $query mysql_query("SELECT * FROM `tabelle` ORDER BY `id` DESC");
                            while(
                        $row   mysql_fetch_array($query)) {
                                
                        $id                   $row['id'];
                                
                        $hersteller_link               str_replace(' ''-'$row['hersteller']);
                                
                        $produkt_link           str_replace(' ''-'$row['produkt']);
                                
                        $hersteller                   $hersteller_link;
                                
                        $hersteller_link               strtolower($hersteller_link);
                                
                        $produkt_link           strtolower($produkt_link);

                                
                        $neuer_link                  "/".$hersteller_link."-".$produkt_link."/".$id."/";
                                
                        $link_hersteller             "/".$hersteller_link."-produkte/";

                                
                        $message preg_replace('#\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/([_a-zA-Z0-9\-]{1,255})\/'.$id.'.html#'$neuer_link$message);
                                
                        $message preg_replace('#\/'.$hersteller.'_produkte.html#'$link_hersteller$message);
                            } 
                        Jetzt hätte ich nur noch folgende Frage: wie könnte ich denn jetzt nur relevante ID's abfragen? Denn momentan läuft die while-Schleife über alle Datensätze (mehrere tausend Stück), obwohl pro Text etwa nur 5 bis 10 verschiedene Produktlinks bzw. Herstellerlinks vorkommen.

                        Eine Idee wie ich das Lösen könnte?
                        Das Genie überblickt das Chaos!

                        Wer Rechtschreibfehler findet, darf sie behalten!

                        Kommentar


                        • #13
                          Zitat von chefdesigner Beitrag anzeigen
                          Eine Idee wie ich das Lösen könnte?
                          Ja, mit preg_match_all in Frage kommende URL-IDs auswählen und aus dem Ergebnisarray eine WHERE-IN-Klausel für die Abfrage erzeugen.
                          [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                          Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                          Super, danke!
                          [/COLOR]

                          Kommentar


                          • #14
                            Nochmals besten Dank, für deine Hilfe.

                            Hat alles wunderbar funktioniert!

                            Wenn du mir jetzt noch nen Ansatz zum Löschen aller verbliebenen Links lieferst, dann mach ich dich zum Helden.
                            Das Genie überblickt das Chaos!

                            Wer Rechtschreibfehler findet, darf sie behalten!

                            Kommentar


                            • #15
                              Zitat von chefdesigner Beitrag anzeigen
                              Wenn du mir jetzt noch nen Ansatz zum Löschen aller verbliebenen Links lieferst
                              Beim Ersetzen mit DB-Daten fügst du ein bestimmtes Sonderzeichen ein, z. B. \x01. Dann entfernst du mit preg_replace alle Links, die es nicht enthalten. Danach entfernst du es wieder.

                              Zitat von chefdesigner Beitrag anzeigen
                              dann mach ich dich zum Helden.
                              Nicht, dass ich das nötig hätte, aber ich frag mich grad wie du das machen willst.
                              [COLOR="DarkSlateGray"]Hast du die [COLOR="DarkSlateGray"]Grundlagen zur Fehlersuche[/color] gelesen? Hast du Code-Tags benutzt?
                              Hast du als URL oder Domain-Beispiele example.com, example.net oder example.org benutzt?
                              Super, danke!
                              [/COLOR]

                              Kommentar

                              Lädt...
                              X