gondor: Mail wieder preg_match-Problem ;-)

Hallo,

wahrscheinlich die x'te Anfrage zu regulären Ausdrücken...

Sorry, aber ich habe schon lange vergeblich versucht. Hier mein Problem:

Ich möchte innerhalb eines Strings nach einem Wort suchen:

Der String kann folgend aussehen:

$string = '<p>Text</p><p>###last_order</p><p>Text</p>';

oder

$string = '<p>Text</p><p>###last_order_mwst</p><p>Text</p>';

  
if (preg_match("/###last_order/i", $string)) {  
echo "Es wurde eine Übereinstimmung gefunden.";  
} else {  
echo "Es wurde keine Übereinstimmung gefunden.";  
}  
  
if (preg_match("/###last_order_mwst/i", $string)) {  
echo "Es wurde eine Übereinstimmung gefunden.";  
} else {  
echo "Es wurde keine Übereinstimmung gefunden.";  
}  

Bei der ersten Variante kommt:

Es wurde eine Übereinstimmung gefunden.
Es wurde keine Übereinstimmung gefunden.

Bei der zweiten Variante kommt:

Es wurde eine Übereinstimmung gefunden.
Es wurde eine Übereinstimmung gefunden.

Hier liegt der Fehler. Ich möchte bei der zweiten Variante nur dann eine
Übereinstimmung haben, wenn auch wirklich 'last_order_mwst' im String
enthalten ist und nicht bei einem Teilstring 'last_order...'

Wie komme ich also zu dieser Ausgabe?

Es wurde keine Übereinstimmung gefunden.
Es wurde eine Übereinstimmung gefunden.

Danke für Hilfe,
gondor(..)

  1. Wie komme ich also zu dieser Ausgabe?

    In der Annahme, dass deine Schlüsselworte aus [A-Za-z0-9_] bestehen:
    \b stellt eine wordboundary dar, dass 0 weite darstellt.
    Es ist in "abc012<,.,.-,.,,,sdfjkh"
                     ^hier      ^hier

    if (preg_match("/###last_order_mwst\b/i", $string)) {
     echo "Es wurde eine Übereinstimmung gefunden.";
     } else {
     echo "Es wurde keine Übereinstimmung gefunden.";
     }

    ...könnte dich zum Ziel führen.

    ob _ wirklich in PHP als word interpretiert wird, habe ich jetzt nicht getestst, ist aber in Perl der Fall

    mfg Beat

    --
    Woran ich arbeite:
    X-Torah
    ><o(((°>        ><o(((°>
       <°)))o><                      ><o(((°>o
    1. so einfach...

      danke!

      gondor(..)

  2. Hallöchen,

    if (preg_match("/###last_order/i", $string)) {
    echo "Es wurde eine Übereinstimmung gefunden.";
    } else {
    echo "Es wurde keine Übereinstimmung gefunden.";
    }

    if (preg_match("/###last_order_mwst/i", $string)) {
    echo "Es wurde eine Übereinstimmung gefunden.";
    } else {
    echo "Es wurde keine Übereinstimmung gefunden.";
    }

      
    Wenn du mit preg\_match arbeitest, und der Suchbegriff definitiv am Ende von $string ist, dann setze unmittelbar nach dem Suchbegriff ein $-Zeichen (steht für "Zeilenende"):  
      
      if (preg\_match("/###last\_order$/i", $string)) {  
      ------------------------------^  
    bzw.  
      if (preg\_match("/###last\_order\_mwst$/i", $string)) {  
      -----------------------------------^  
      
      
    MfG  
    vaudi
    
    1. Hello,

      Wenn du mit preg_match arbeitest, und der Suchbegriff definitiv am Ende von $string ist, dann setze unmittelbar nach dem Suchbegriff ein $-Zeichen (steht für "Zeilenende"):

      if (preg_match("/###last_order$/i", $string)) {
        ------------------------------^
      bzw.
        if (preg_match("/###last_order_mwst$/i", $string)) {
        -----------------------------------^

      Aber das Pattern dann nicht in Doppelhäkchen bauen, sondern in einfachen.

      if (preg_match('/###last_order_mwst$/i', $string))

      sonst könnte der PHP-Parser Dir in die Suppe spucken.
      http://www.php.net/manual/en/language.types.string.php

      Liebe Grüße aus Syburg bei Dortmund

      Tom vom Berg

      --
      Nur selber lernen macht schlau
      http://bergpost.annerschbarrich.de
    2. Hi,

      Wenn du mit preg_match arbeitest, und der Suchbegriff definitiv am Ende von $string ist,

      was definitiv nicht der Fall ist, siehe die Beispiele, die gondor angegeben hat.

      cu,
      Andreas

      --
      Warum nennt sich Andreas hier MudGuard?
      O o ostern ...
      Fachfragen unaufgefordert per E-Mail halte ich für unverschämt und werde entsprechende E-Mails nicht beantworten. Für Fachfragen ist das Forum da.