suchgen und ersetzen realtiver Pfade

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

  • suchgen und ersetzen realtiver Pfade

    Ich bastel damit schon seit einiegn Std herum.

    Normalerweis kann man ja ganz einfach mit str_replace()


    Zeichenketten durchsuchen und ersetzen.

    Das geht bei Pfaden aber leider nichtn da ich bei jedem fund eine rückmeldung benötige bzw eine abfrage ob gewissen bedingungen erfüllt sind.

    In meinem fall benötige ich es um auf dem eigen Server .html und .php Dateien auszulesen und in einem CMS zu importieren.





    Schon mal vorweg derInhalt wird noch weiter Formatiert deshalbt ist ein Iframe kein Lösung.



    Ich hatte mir das so vorgestellt:


    $dateinhalt = include('dateiname.htm');



    Suche nach--- href=" ---- in $dateinhalt


    ->gib position von ---- " ---- aus un schreibe in $str_pos

    Gib string zwischen position und nächstem -- "> -- aus

    ->schreibe in variable $url_str


    Ersetze $url_str durch -- http://domain.de/$url_str---
    wenn $url_str kein -- ./ -- oder http:// enthält.


    Solange bis keine funde mehr in inhalt der variabeln abgearbeiet wurde.



    Ende schleife ##### While($str_pos == false){......###




    Gibt es dafür eine einfachere Lösung oder muss man das so Kompleziert machen?




    Mir macht eiegnlich nur das Problem das eben nur bei der bedingung keien http oder ./ vorhanden sein soll.



    str_replace() verarbeiet ja immer gleich den ganzen string.


    Da aber inerhalbt des strings verschiede Bedingungen auftreten muss nach jeder fund / abarbeitung dei Schleife von neuem begonne werden.





    Das geht wohl auch noch mit preg_match()

    Habe es damit aber nicht hinbekommen.

    Jemand eine Idee wie man das einfach Lösen kann?



    LG
    Zuletzt geändert von schnikemike; 16.03.2007, 19:35.

  • #2
    Reguläre Ausdrücke (preg_replace mit dem Parameter e)
    Bei $docRoot musst du den Verzeichnisnamen deines Webauftrittes angeben (den letzten Ordnernamen den ein echo $_SERVER['DOC_ROOT'] ergibt).
    Code:
    function clean($str){
      // z.B. D:\progs\srv\apache\htdocs
      $docRoot = 'htdocs';
      $strr = dirname(realpath($str));
      $strr = str_replace('\\','/',$strr);
      $strr = substr($strr,strpos($strr,'/',strpos($strr,$docRoot)));
      $str = str_replace(array('../','./'),'',$str);
      return $strr.'/'.basename($str);
    }
    $string = '<a href="../news/index.php">test</a>';
    echo preg_replace('/href="([^"]*)/e',"'href=\"http://deineDomain.de'.clean('\\1')",$string);
    Gruss und gute Nacht

    tobi

    p.s. geht leider ned mit php Tags weil es sonst ne wilde Escaperei geben würde
    Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

    [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
    Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

    Kommentar


    • #3
      Danke dir für die Hilfe.

      Nach dem ich noch einige ansätze versucht habe aber leider immernoch zu Blöde daführ bin muss ich leider nochmal nachfragen.

      Das mit preg_replace() war auf jedenfall schon mal ein guter Hinweis.

      preg_replace_callback() kann man wohl auch noch verwenden.

      Leider blicke ich das mit den Regular Expression noch nicht wirklich.
      Hab mal versucht mich hier einzulesen.

      http://tut.php-q.net/regex.htm


      Kann mir jemand erklären was das genau bedeutet

      '/href="([^"]*)/e'

      Ok die eckige Klammer steht für eine Zeichenklasse.
      Was immer das hier auch bedeuten mag

      ^ =
      Wenn man ein Zeichen matchen möchte, welches nicht in dieser Zeichenklasse vorhanden ist, so muss man nach der eckigen Klammer- Auf ein ^ schreiben.
      bei href=" [^"] wird dann also von dem href="......bis" gematch?


      Aber für was steht das (....*)?

      Die beschreibung zum Parameter e habe ich hier gefunden.

      http://regexp-evaluator.de/tutorial/.../preg-replace/


      Was bedeute die clean() funktion ich finde da nix drüber?

      clean('\\1')


      So jetzt habe ich noch ein paar Pfade mehr die ich ersetzen muss Bilder und LifeStream Urls.

      Ich liste hier mal kurz auf was im regelfall zu ersetzen ist.


      href="unterschidelicherdateiname.xxx"


      img src="unterschiedlicherdateiname.xxx"


      href="./unterschidelicherdateiname.xxx"


      img src="./unterschiedlicherdateiname.xxx"


      href="../unterschidelicherdateiname.xxx"


      img src="../unterschiedlicherdateiname.xxx"


      href="/unterodner/unterschidelicherdateiname.xxx"


      img src="/unterodner/unterschiedlicherdateiname.xxx"





      Da soll dann immer http://domnain.xy/ davor.



      Kann mir da jemand noch einen gedanken anstoss geben.

      lg
      Zuletzt geändert von schnikemike; 16.03.2007, 19:39.

      Kommentar


      • #4
        ^ als erstes Zeichen in eckigen Klammern heisst NICHT --> alles was nicht " ist. Ausserhalb eckiger Klammern heisst es Anfang vom String

        ( und ) heissen im Suchmuster, dass du diese Unterausdrücke erhalten willst. Auf diese geklammerten Resultate kannst du mit \\1 etc zugreifen.
        clean() ist der Name der Funktion wie ich sie genannt habe, kannst sie auch apfel(), birne(), ei() oder was_auch_immer() nennen.
        /e heisst dass bei der Ersetzung php Code ausgeführt wird und clean() ist die Funktion die aufgerufen wird, bevor ersetzt wird.

        Gruss

        tobi
        Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

        [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
        Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

        Kommentar


        • #5
          Manchmal habe ich Tomaten auf den Augen sorry.

          Ich hatte mir den Code rauskopiert und blöderweise clean umbenannt.

          Man o man ist natühlich sonnenklar.

          Da ich das in einer while schleife verarbeiet hatte ists mir nichtmehr aufgefallen.


          Wer lesen kann ist klar im vorteil!

          Sorry

          Kommentar


          • #6
            Irgenwie bin ich immernoch zu blöde daführ! Grübel

            Habe jetzt mal alle meine variationen weggelassen und es einfach nur so gemacht.


            PHP-Code:
            $datei_str =file_get_contents($dateiimport);
            $str=$datei_str;

            function 
            clean($str){
             
            $docRoot 'html';  
              
            $strr dirname(realpath($str));
              
            $strr str_replace('\\\','/',$strr);
              $strr = substr($strr,strpos($strr,'
            /',strpos($strr,$docRoot)));
              $str = str_replace(array('
            ../','./'),'',$str);
              return $strr.'
            /'.basename($str);
            }
            #$str = '
            <a href="../news/index.php">test</a>';




            echo preg_replace('
            /href="([^"]*)/e',"'href=\"http://www.domain.de/modules'.clean('\\1')",$str); 
            Es kommt aber immer nur die Orginal datei zum vorschein ohne das llinks ersetzt wurden.



            Ich habe und einen kleine Fehler ausgebessert.

            str_replace('\\','/',$strr);

            statt
            str_replace('\','/',$strr);


            irgenwie wird aber nicht ersetzt es belibt alles gleich.



            Im übrigen wird mir stimmt hier was mit der PHP anzeieg nicht!



            Wenn ich auf Editieren gehe steht da
            str_replace(' \ \ ','/',$strr); leerstelle eingebaut damit es angezeigt wird!!


            angezeigt wird


            str_replace('','/',$strr);


            ?????
            Zuletzt geändert von schnikemike; 16.03.2007, 19:35.

            Kommentar


            • #7
              Ich habe und einen kleine Fehler ausgebessert.

              str_replace('\','/',$strr);

              statt
              str_replace('','/',$strr);
              und dabei ein zeichen escaped und einen neuen fehler eingebaut ...
              Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

              Kommentar


              • #8
                @topicstarter

                $strr = str_replace('\\','/',$strr);

                habe bei meinem Code selber nicht richtig escaped

                Gruss

                tobi
                Gutes Tutorial | PHP Manual | MySql Manual | PHP FAQ | Apache | Suchfunktion für eigene Seiten

                [color=red]"An error does not become truth by reason of multiplied propagation, nor does truth become error because nobody sees it."[/color]
                Mohandas Karamchand Gandhi (Mahatma Gandhi) (Source)

                Kommentar


                • #9
                  Was ist den mit der PHP anzeige hier los?

                  Hier wird

                  str_replace('\\','/',$strr); Hier soll ' \ \ ' stehen

                  zu

                  str_replace('','/',$strr);

                  ???

                  aus ' \ \ ' wird
                  PHP-Code:
                  str_replace('\\','/',$strr); 
                  Zuletzt geändert von schnikemike; 16.03.2007, 19:18.

                  Kommentar


                  • #10
                    OffTopic:
                    Was ist den mit der PHP anzeige hier los?
                    kann sein das stripslashes drüberläuft oder so
                    Die Regeln | rtfm | register_globals | strings | SQL-Injections | [COLOR=silver][[/COLOR][COLOR=royalblue]–[/COLOR][COLOR=silver]][/COLOR]

                    Kommentar


                    • #11


                      Dacht mir auch schon öfter das ich richtig geschrieben hatte aber jetzt weis ich auch warum.


                      Na dann werde ich wohl nochmal den Queltext von tobi auf veränderungen anschauen.

                      Edit: Darn lag es wohl nicht!

                      Ich werde mal weiter suchen.
                      Es kann dohc eigenlich garnicht so schwer sein dafür ein Script hinzubekommen.

                      Leider bekomm ich nicht hin.


                      im Prinzip das geleiche Prob wie hier:

                      Blos ist es bei mir so das Script welches die Dateien einliest und anzeigt in einem anderen Ordner aufgerufen wird und deshalbt ich die Dateipfade ersetzen muss.



                      http://forum.de.selfhtml.org/archiv/2004/8/t86906/
                      Zuletzt geändert von schnikemike; 16.03.2007, 20:55.

                      Kommentar


                      • #12


                        Wenn ich deinen testsring verwend

                        dan geht es aber sobal ich eine HTML datei einlese geht nicht mehr!??

                        $string = '<a href="../news/index.php">test</a>';

                        Funktionieren aber nicht mehr für


                        $string = '
                        .... header
                        <body>
                        <a href="../news/index.php">test</a>
                        <a href="nbla/index.php">terg</a>
                        <a href="./neu/idat.php">idat</a>

                        .... usw in der Html Datei
                        ';


                        Und genau dafür bauche ich es aber.

                        Kannst du dir das nochmal anschaeun Tobi.

                        Ich komme da nicht weiter.
                        Zuletzt geändert von schnikemike; 16.03.2007, 22:24.

                        Kommentar


                        • #13
                          http://regexp-evaluator.de/evaluator...502d/#ergebnis

                          da hats mit deiner Vorgabe: "$string = '
                          .... header
                          <body>
                          <a href="../news/index.php">test</a>
                          <a href="nbla/index.php">terg</a>
                          <a href="./neu/idat.php">idat</a>

                          .... usw in der Html Datei
                          ';"
                          funktioniert.

                          Pattern ist : "&(href|src)=\"(???:http://)?(?:www\.)?\w*\.\w{2,5}/)|(?:\.{0,2}/)?)(.*?\.\w{1,4})\"&is";

                          Replace ist: "$1=\"http://domnain.xy/$2\"";

                          Es ginge sicher noch ein bisschen einfacher, aber ich habe momentan keine Zeit mehr.

                          MfG

                          JMC

                          Kommentar


                          • #14
                            Hey Klasse.

                            Das ding ist ja genial!!!


                            Wusste garnich das es sowas gibt.



                            So jetzt funktioniert es sow wie ich das will.

                            Danke euch allen!


                            Wenn ich jetzt noch verstehen würde was die RegularExpression regel bedeutet dan wäre es Perfect.

                            Aber kommt Zeit kommt Rat.
                            Zuletzt geändert von schnikemike; 17.03.2007, 14:48.

                            Kommentar


                            • #15
                              jetzt hätte ich nochmal was:




                              ich möchte nach dem durchlauf nochmal die Pfade anpassen.



                              /modules/produkts/bankruptcy/dateiname.html


                              /modules/andereordner/aendertsich/blabal.htm


                              /modules/wiederanderusw/unterschiedlich/dat.zip

                              zu
                              http:///modules.php?name=produkts&fi...dateiname.html

                              http:///modules.php?name=andereordne...ner=blabal.htm

                              usw



                              Komme da aber nicht auf die Regel.

                              Zuletzt geändert von schnikemike; 17.03.2007, 17:21.

                              Kommentar

                              Lädt...
                              X