Ankündigung

Einklappen
Keine Ankündigung bisher.

Teil eines mehrzeiligen Strings auslesen

Einklappen

Neue Werbung 2019

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

  • Teil eines mehrzeiligen Strings auslesen

    Liebe PHP-Profis,

    ich möchte aus einem Mehrzeiligen String eine bestimmte Zeichenkette auslesen:

    PHP-Code:
    $page_id 0;
    $page_release 2;
    $title "Kontaktformular Titel und Überschrift";
    $includepath "_inc/"
    Bisher hatte ich das unter PHP 7 mit folgendem Code gelöst:

    PHP-Code:
    ereg("title(.*)includepath" $inhalt $titeldirect); 
    Unt dann in weiteren Schritten überflüssige Textelemente entfernt. Sicher geht das eleganter - aber es hat funktioniert.

    Das Resultat soll:

    PHP-Code:
    Kontaktformular Titel und Überschrift 
    sein.

    Unter PHP 8 wird der Befehl:

    PHP-Code:
    preg_match_all 
    empfohlen. Leider komme ich nicht zu einem Lösung. Könnt Ihr mir bitte helfen?
    Besten Dank und liebe Grüße

    Mike

  • #2
    Zitat von MagicMike Beitrag anzeigen
    Bisher hatte ich das unter PHP 7 mit folgendem Code gelöst:

    PHP-Code:
    ereg("title(.*)includepath" $inhalt $titeldirect); 
    Wirklich?

    This function was DEPRECATED in PHP 5.3.0, and REMOVED in PHP 7.0.0.
    Zum Thema.. Ganz verstehe ich nicht was du willst.

    Das Resultat soll:

    PHP-Code:
    Kontaktformular Titel und Überschrift 
    sein.
    Das ist doch genau der Inhalt der Variable.

    PHP-Code:
    $title "Kontaktformular Titel und Überschrift"
    So Generell: preg_ braucht Delimiter, also Begrenzer.

    https://regex101.com/r/KYDz2G/1

    PHP-Code:
    $re '/title(.*)includepath/m';
    $str 'title dann noch ein Text includepath';

    preg_match_all($re$str$matchesPREG_SET_ORDER0);

    // Print the entire match result
    var_dump($matches); 
    The string "()()" is not palindrom but the String "())(" is.

    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
    PHP.de Wissenssammlung | Kein Support per PN

    Kommentar


    • #3
      Ich habe mir ein PHP-Script entwickelt, welches meine gesamte Homepage durchforscht und automatisch eine sitemap.xml schreibt.
      Dabei liest das PHP die ersten 150 Zeilen aller Seiten aus:

      PHP-Code:
          $inhalt fread($datei150); // 150 Zeichen lesen 
      Und extrahiert dann den Text der $titel variable. Gibt es da einen eleganteren Weg?
      Ich habe das PHP-Script vor Jahren geschrieben musste jetzt aber meine Homepage auf Strato auf PHP 8 umstellen...

      Kommentar


      • #4
        Wie sieht denn so eine "Seite" aus? Ist ja scheinbar kein HTML. Zeig mal ein Beispiel.
        The string "()()" is not palindrom but the String "())(" is.

        Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
        PHP.de Wissenssammlung | Kein Support per PN

        Kommentar


        • #5
          Zitat von hausl Beitrag anzeigen
          Wie sieht denn so eine "Seite" aus? Ist ja scheinbar kein HTML. Zeig mal ein Beispiel.
          PHP-Code:
          <?php
          $page_id 
          0;
          $page_release 2;
          $title "Kontaktformular";
          ?>

          <head>
          <title><?php echo $title ?></title>
          <meta charset="utf-8">
          <meta name="keywords" content="..." />
          <meta name="description" content="..." />
          <meta name="Page-Topic" content="..." />

          <meta name="robots" content="noarchive" />
          <meta name="googlebot" content="noarchive" />
          ...
          Es ist eine HTML-Seite mit PHP-Elementen...

          Kommentar


          • #6
            Du möchtest also die rohen Php-Dateien durchsuchen, und nicht deren Ausgabe.
            Dabei verlässt du dich darauf, dass auf die Zeile mit der variable $title immer die Zeile mit der variablen $includepath folgt...

            musst du aber gar nicht, wenn die $title Zeile selbst nicht mehrzeilig ist.
            Ich würde hier tatsächlich zeilenweise nachsehen, ob die (getrimmte) Zeile mit $title beginnt, und dann alles zwischen dem ersten und dem letzten Anführungszeichen pflücken.

            Wenn deine Titel selber keine Anführungszeichen enthalten, sollte das die sache noch vereinfachen.

            ​​​​​​Mögliche Stolperstricke wären dann nur noch, wenn du in verschiedenen Dateien mal einfache und mal doppelte Anführungszeichen verwendet hast, aber auch das kann man ja berücksichtigen.

            Ungefähr so (nicht geprüft)
            $re = "/title.*["'](^["']*)["']/"

            - beginnt mit title
            - dann kommen beliebig viele irgendwelche zeichen
            - dann kommt ein " oder '
            -- jetz kommt, woran wir interessiert sind in klammern, nämlich beliebige Zeichen, die Nicht " oder ' sind
            - nun wieder ein " oder ' als Abschluss außerhalb der klammer

            Kommentar


            • #7
              Zitat von reddighamburg Beitrag anzeigen
              Du möchtest also die rohen Php-Dateien durchsuchen, und nicht deren Ausgabe.
              Dabei verlässt du dich darauf, dass auf die Zeile mit der variable $title immer die Zeile mit der variablen $includepath folgt...

              musst du aber gar nicht, wenn die $title Zeile selbst nicht mehrzeilig ist.
              Ich würde hier tatsächlich zeilenweise nachsehen, ob die (getrimmte) Zeile mit $title beginnt, und dann alles zwischen dem ersten und dem letzten Anführungszeichen pflücken.

              Wenn deine Titel selber keine Anführungszeichen enthalten, sollte das die sache noch vereinfachen.

              ​​​​​​Mögliche Stolperstricke wären dann nur noch, wenn du in verschiedenen Dateien mal einfache und mal doppelte Anführungszeichen verwendet hast, aber auch das kann man ja berücksichtigen.

              Ungefähr so (nicht geprüft)
              $re = "/title.*["'](^["']*)["']/"

              - beginnt mit title
              - dann kommen beliebig viele irgendwelche zeichen
              - dann kommt ein " oder '
              -- jetz kommt, woran wir interessiert sind in klammern, nämlich beliebige Zeichen, die Nicht " oder ' sind
              - nun wieder ein " oder ' als Abschluss außerhalb der klammer
              Super lieben Dank für dein ausführliches Feedback und die Erklärungen im Detail. Das macht diese Ausdrücke für mich deutlich verständlicher...

              Kann es sein, das sich in der Zeile ein Syntax-Fehler eingeschlichen hat: (Oder ich setze die entsprechenden Variablen nicht ein...?)

              PHP-Code:
              $re "/title.*["'](^["']*)["']/" 
              Ich bekomme eine Fehlermeldung:

              PHP-Code:
              Parse errorsyntax errorunexpected single-quoted string "](^["", expecting ")" in /mnt/.../include_sitemap_generator.php on line 141 
              Würdest Du mir den Ausdruck mal exakt so schreiben, wie er sein müsste, damit ich den Inhalt zwischen den beiden " (Anführungszeichen) in der Zeile bekomme! Lieben Dank!

              PHP-Code:
              preg_match_all(
                      
              "/title.*["'](^["']*)["']/",
                      
              $inhalt,
                      
              $titel,
                      
              PREG_PATTERN_ORDER        
                  
              ); 

              Kommentar


              • #8
                Ich habe mir ein PHP-Script entwickelt, welches meine gesamte Homepage durchforscht und automatisch eine sitemap.xml schreibt.
                Dabei liest das PHP die ersten 150 Zeilen aller Seiten aus:
                und da gibt es echt nichts besseres als regex ?

                #erstellen aus der db ?
                parsen der ausgabe mit domsdoc ?
                (..)

                Kommentar


                • #9
                  Zitat von tomBuilder Beitrag anzeigen
                  und da gibt es echt nichts besseres als regex ?

                  #erstellen aus der db ?
                  parsen der ausgabe mit domsdoc ?
                  (..)
                  Es ist eine reine PHP-Webseite. Da ist also keine DB...

                  Ich habe eine Lösung gefunden: Diese preg_match_all funktion mit einem kleinen Fix funktioniert:

                  PHP-Code:
                      preg_match_all(
                          
                  '/"(.*?)"/',
                          
                  $inhalt,
                          
                  $titel,
                          
                  PREG_PATTERN_ORDER        
                      
                  );     
                      
                  $titel str_replace(""", "", $titel) ; 
                  Eingebaut in diesen PHP-Code duchsucht der Code die gesamte Homepage-Struktur und erzeugt eine HTML-Sitemap:

                  https://www.mike-reiss.com/sitemap.php

                  Gleichzeitig erzeugt der Code eine sitemap.xml Datei die Google-konform und funktional ist:

                  https://www.mike-reiss.com/sitemap.xml

                  Danke für die tolle Unterstützung hier! Das hat mir sehr weiter geholfen...

                  Lieben Dank!
                  Mike.

                  Kommentar


                  • #10
                    Wenn jede Seite nur genau einen Titel hat, dann reicht preg_match() auch und über den Index[1] kannst du direkt auf das im Ausdruck über die Klammern gefangenen zugreifen:

                    PHP-Code:
                    $title '"Kontaktformular"'// in der Form mit einfachen und doppelten Quotes zum Test weil du es als reinen Text aus der Datei liest.


                    $aMatches = [];

                    preg_match(
                        
                    '/"(.*?)"/',
                        
                    $title,
                        
                    $aMatches
                    );

                    echo 
                    $aMatches[1];
                    // Ausgabe: Kontaktformular 
                    The string "()()" is not palindrom but the String "())(" is.

                    Debugging: Finde DEINE Fehler selbst! | Gegen Probleme beim E-Mail-Versand | Sicheres Passwort-Hashing | Includes niemals ohne __DIR__
                    PHP.de Wissenssammlung | Kein Support per PN

                    Kommentar


                    • #11
                      Wenn der Inhalt als Datei vorliegt würde ich folgendes probieren:
                      PHP-Code:
                      include $filename;
                      var_dump($title); 
                      Wenn der Inhalt nur ein String ist, hilft vielleicht folgendes:
                      PHP-Code:
                      $content '
                      $page_id = 0;
                      $page_release = 2;
                      $title = "Kontaktformular Titel und Überschrift";
                      $includepath = "_inc/";
                      '
                      ;

                      $filename tempnam('''php');
                      file_put_contents(
                          
                      $filename,
                          
                      '<' '?php ' $content
                      );
                      include 
                      $filename;
                      unlink($filename);

                      var_dump($title); 

                      Kommentar

                      Lädt...
                      X