PHP Funktion Umschreiben

  • Hi,

    Kann mir jemand beim Abändern dieser Funktion hier kurz helfen?

    Diese Funktion ermöglicht es mir in einer Datei eine Codestelle zu suchen und zu ersetzen.
    Wenn diese mehrfach vorkommt wird sie auch mehrfach ersetzt.

    Ich habe nun hier unzählige Datein in denen überall das selbe ersetzt werden soll.
    Das wäre ein großer Aufwand diese funktion derart oft aufzurufen.

    Ich hätte die gern so abgeändert das die funktion automatisch in ALLEN Datein die in dem Ordner wo die Datei mit der Funktion drin ist + ALLE Datein in Unterverzeichnissen
    sucht und ersetzt.
    Einzige Bedingung nur PHP Datein sollen bearbeitet werden.

    Kann mir da jemand helfen?

    Mittels dieses Scripts soll eine Webseite (Skript) automatisch auf PHP 7.1 umgeschrieben werden btw.
    Da das CMS mehrfach eingesetzt wird eine extrem Zeitsparende Variante.

    Einmal editiert, zuletzt von Michael_ (7. April 2017 um 00:14)

  • Muss es denn in PHP sein? Für die Aufgabe reicht doch auch ein Shell-Befehl auf dem betreffenden Linux-Server:

    Code
    find . -iname "*.php" -exec sed -i "s/suchbegriff/zielbegriff/gi" {} \;

    Wenn du auf dem Server nur PHP zur Verfügung hast dafür, warten wir mal die anderen Antworten ab. Bin gerade zu müde, um mir dahingehend was zu überlegen.

  • Muss mit PHP gemacht werden da nur Webspace.
    Was noch gut wäre ist wenn ich in dem Script den Pfad zum Root ordner angeben könnte Datein aus selbigem und Datein aus Unterordnern selbigen sollen dann alle bearbeitet werden (alle PHP Datein, keine z.b. .js datein)

    Ja muss auch nicht gleich sein würde morgen z.b. reichen :)

  • Code
    function multiplefilereplace ($string1, $string2)
    {
    foreach (glob("../../*.php") as $filename)
    {
        $file = file_get_contents($filename);
        file_put_contents($filename, preg_replace("/$string1/", $string2, $file));
    }
    }

    Das hier funktioniert schonmal in mehreren Datein Allerdings nur im angegebenen verzeichnis.
    Wie kann ich es erreichen das auch datein in den unterverzeichnissen bearbeitet werden?

  • Ich hab die Funktion aktuell so abgeändert aber das ist nicht so das wahre

    Den sollte mal ein weiteres Verzeichnis eine bearbeitung benötigen dann wird es nicht berücksichtigt.

    Ich hab diverses wie auch das probiert aber ich kriegs nicht zum laufen

  • Nach einer Funktionsdefinition wird übrigens alles eingerückt. Man kann sich zwar dagegen entscheiden, ist aber einfach zu gängig.

    "Ich hab diverses wie auch das probiert aber ich kriegs nicht zum laufen"

    An was liegt es denn? Stimmt bei letzterem Beispiel denn die Pfadangabe? Sehen die Dateinamen richtig aus, wenn du mal $filename in der Schleife mit einem echo $filename, '<br>'; ausgeben lässt?

  • Bei Glob habe ich ../../*.php als Pfad angegeben und das verzeichnis stimmt.

    Array
    Warning: file_get_contents() expects parameter 1 to be a valid path, array given in /www/htdocs/w0125294/script/updater/system/functions.php on line 24

    echo $filename;
    gibt garnix aus.

    Einmal editiert, zuletzt von Michael_ (7. April 2017 um 19:56)

  • Ich habs mal so probiert

    Code
    function fullreplace ($string1, $string2)
    {
    foreach (glob("../../".'*') as $filename)
    {
        $file = file_get_contents($filename);
        file_put_contents($filename, preg_replace("/$string1/", $string2, $file));
    }
    }

    Fehlermeldungen

    Die angegeben verzeichnisse würden ja schonmal stimmen und alle haben CHMOD 777 die Datein auch,
    woran liegt das?

    Außerdem wäre es schön wenn ich das verzeichnis "update" ausschließen könnte aus der Liste.

  • Wenn du schon unbedingt glob nutzen willst, dann gibt glob('../../*') logischerweise den gesamten Inhalt des überübergeordneten Verzeichnis aus, also auch alle Vetter-Verzeichnisse. Du willst das vermutlich auf PHP-Dateien (*.php) einschränken.

  • Ja und wie mache ich das?
    Das alle PHP Datein in den gelisteten Verzeichnissen angezeigt/bearbeitet werden?

    Ich versuch das nun seit stunden schon -.-



    ../../*
    Zeigt mir zwar ne Fehlermeldung an und alle Ordner aber
    ../../*.php bearbeitet nur die Datein in dem root verzeichnis ../../

    Es muss auch nicht glob sein hauptsache eine funktion die das tut was ich will -.-

    Einmal editiert, zuletzt von Michael_ (7. April 2017 um 22:11)

  • Zwei Punkte:
    1. Nutze statt glob die von winfreak vorgeschlagene Variante
    2. Wenn dir jemand helfen soll, rück ordentlich ein, sodass Lesbarkeit gegeben ist

  • Wenn mir jemand eine Funktion gibt die funktioniert mit der winfreak variante dann nehm ich die gerne.
    Ich komm einfach nicht weiter jetzt helft doch bitte mal.



    ENDLICH!

    Das bearbeitet alle meine Datein!
    Allerdings würde ich nun gerne noch das verzeichnis "update" ausschließen.

    BITTE wie krieg ich das hin?
    Sonst überschreibt der auch in den updater Datein die Codestellen was ich nicht möchte.



    MASTER FUNKTION :D

    Funktioniert einwandfrei. :)
    Fast ein ganzer Tag arbeit. :D

    Einmal editiert, zuletzt von Michael_ (7. April 2017 um 23:25)

  • Das hier wäre eine, einigermaßen saubere, Lösung mit dem Iterator. Da ich nicht davon ausgehe, dass du mit Exceptions umgehen kannst, ganz klassisch mit return.

    Ein bisschen mehr general purpose wird es so:

    Einmal editiert, zuletzt von winfreak (8. April 2017 um 00:46)

  • Danke!
    str_replace hat das irgendeinen nachteil gegenüber preg_replace weil mit preg_replace komm ich grad garnicht klar wenn ich versuche z.b. mysql_query( mit mysqli_query($db, zu ersetzen.
    Mit str_replace nun funktioniert das bestens daher bin ich ganz froh das ich die funktion nun auch habe. :D

  • Der Vorteil von preg_replace ist, dass du reguläre Ausdrücke verwenden und somit auch Sachen suchen kannst, mit denen str_replace nix anfangen kann, str_replace kann nur Strings als ganzes ersetzen. preg_replace hingegen kann nach bestimmten Mustern im Text suchen und diese entsprechend anpassen. Ist also viel mächtiger.

  • Ich habe nun ein Problem hier mit str_replace.

    Wenn ich z.b.

    Code
    mysql_query($variable

    im quelltext stehen habe und mit

    Code
    mysqli_query($variable

    ersetzen will geht das ganz einfach mittels:

    Code
    singlefilereplace_modern("mysql_query(\$variable", "mysqli_query(\$variable", "../../acp/lib/class_parse.php");

    Wenn ich nun aber als einfaches beispiel

    Code
    $this->replace[] = "\$this->formaturl('\\1')";

    einfach nur entfernen möchte mittels

    Code
    singlefilereplace_modern("\$this->replace[] = \"\$this->formaturl('\\1')\";", "", "../../acp/lib/class_parse.php");

    dann passiert nichts, auch wenn ich

    Code
    singlefilereplace_modern("\$this->replace[] = \"\$this->formaturl('\\1')\";", "JUNGE", "../../acp/lib/class_parse.php");

    nehme passiert garnichts.
    Woran genau liegt das? ich denke es hat mit den \ zu tun und somit Syntax aber ich weiß nicht wie ich das Problem beheben kann und was ich überhaupt falsch mache.

    vllt. liegt es auch an meiner Funktion die ich hierfür benutze?

    Code
    function singlefilereplace_modern ($string1, $string2, $string3)
    {
    foreach (glob("$string3") as $filename)
    {
        $file = file_get_contents($filename);
    file_put_contents($filename, str_replace($string1, $string2, $file));    
    }
    }

    Brauche ich dafür preg_replace? Falls ja wie gehe ich damit richtig um?
    Ergo wie passe ich den Code der gesucht und ersetzt werden soll so an das er passt?

Jetzt mitmachen!

Du hast noch kein Benutzerkonto auf unserer Seite? Registriere dich kostenlos und nimm an unserer Community teil!