Tom: Regular Expressions mit Backreferenz

Hello,

wie muss ich ndas machen, um für die Häkchen eine Backreferenz zu nutzen?

String:   module.php(22): require_once( DIRECTORY_PATH . 'design.inc.php' );
          module.php(22): require_once( DIRECTORY_PATH . "design.inc.php" );

$pattern = '~^(.*.php)(\d+)(?:.*?)'"['"]~i';
                                      ---       ---

die beiden unterstrichenen Stellen würde ich gerne durch Referenz und Backreferenz ersetzen.
Leider bekomme ich es nicht hin.

Versuche:

$pattern = '~^(.*.php)(\d+)(?:.*?)('|")(.*?)\3~i';
$pattern = '~^(.*.php)(\d+)(?:.*?)(['"])(.*?)\3~i';

usw.

gesucht werden 'aemodule.php' und 'design.inc.php'

Liebe Grüße aus dem schönen Oberharz

Tom vom Berg

--
Nur selber lernen macht schlau
http://bergpost.annerschbarrich.de
Den obligatorischen (Ab-)Satz mit Uschi und Wolle verkneife ich mir diesmal
  1. +- ca. 3 Wochen um den 1. April herum, denke ich, habe ich das in einem Thread gesehen. Ich habe schon gesucht, vielleicht finde ich ihn auch noch.

    1. ... vielleicht finde ich ihn auch noch.

      Leider nicht, aber vielleicht schaut ja derjenige hier rein, der dort schon geantwortet hat.

  2. Hi,

    wie muss ich ndas machen, um für die Häkchen eine Backreferenz zu nutzen?

    String:   module.php(22): require_once( DIRECTORY_PATH . 'design.inc.php' );
              module.php(22): require_once( DIRECTORY_PATH . "design.inc.php" );

    $pattern = '~^(.*.php)(\d+)(?:.*?)'"['"]~i';

    die beiden unterstrichenen Stellen würde ich gerne durch Referenz und Backreferenz ersetzen.
    Leider bekomme ich es nicht hin.

    Versuche:

    $pattern = '~^(.*.php)(\d+)(?:.*?)('|")(.*?)\3~i';
    $pattern = '~^(.*.php)(\d+)(?:.*?)(['"])(.*?)\3~i';

    Schau dir Treffer-Array, das preg_match dir liefert, mittels var_dump an.

    Dann siehst du, dass bei
    ~^(.*.php)(\d+)(?:.*?)('|")(.*?)['"]~i
    das Hochkomma bzw. Anführungszeichen als Treffer mit dem Index 2 zurückgeliefert wird:

    array(4) {
      [0]=>
      string(63) "module.php(22): require_once( DIRECTORY_PATH . 'design.inc.php'"
      [1]=>
      string(10) "module.php"
      [2]=>
      string(1) "'"
      [3]=>
      string(14) "design.inc.php"
    }

    Der erste Eintrag im Array ist keine Back Reference, sondern der Textteil, auf den der komplette Suchausdruck passt.

    Für alles, was nach "module.php(22)" bis zum gesuchten Textstück kommt, hast du entweder keine capturing parentheses gesetzt, oder die Erstellung einer Back Reference explizit abgeschaltet.

    Also ist die Back Reference, die du später ansprechen willst, um auch dort wieder nach dem ' resp. " zu suchen, die Nummer 2, und nicht Nummer 3.

    gesucht werden 'aemodule.php' und 'design.inc.php'

    Na da wirst du bezüglich ersterem aber lange suchen können :-)

    MfG ChrisB

    --
    Light travels faster than sound - that's why most people appear bright until you hear them speak.
    1. Hello,

      Für alles, was nach "module.php(22)" bis zum gesuchten Textstück kommt, hast du entweder keine capturing parentheses gesetzt, oder die Erstellung einer Back Reference explizit abgeschaltet.

      Ja, danke. *duck*

      Ich war schon betriebsblind. Ich habe immer (\d+) als Referenz angesehen und mich immer verzählt. Dabei hatte ich die Klammern ja extra als Bestandteil des gesuchten Musters benutzt.

      Na, immerhin habe ich nun ca. 70 Seiten Auswertung automatisiert, die ich sonst manuell hätte aufdröseln müssen.

      Liebe Grüße aus dem schönen Oberharz

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
      Den obligatorischen (Ab-)Satz mit Uschi und Wolle verkneife ich mir diesmal