kostenloser Webspace werbefrei: lima-city


preg_split count

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Hi,

    ich stehe mal wieder auf dem tag/schlauch">Schlauch. Es geht um folgendes Szenario:

    Ich suche mittels SELECT message FROM tabelle WHERE message LIKE '%[a]%[/a]%' alle "messages" aus der Tabelle, die '%[a]%[/a]%' beinhalten. Funktioniert soweit auch, wie gewollt.

    Nun kann "message" das gesuchte '%[a]%[/a]%' öfters beinhalten, weshalb ich angehalten bin, die Vorkommnisse zu zählen. Meine Idee war nun:

    $count = 0;
    while ($row .....)) {
    $matches = preg_split("/\[a\](.*)\[\/a\]/i", $row['message']);
    $count = $count+count($matches);
    }
    
    echo $count;


    Selbst wenn das so funktionieren würde (was es komischerweise nicht tut), sieht mir das sehr Performancelastig aus. Hat irgendwer eine

    1. funktionierende
    2. performante

    Lösung für dieses Vorhaben auf Lager?

    Beitrag zuletzt geändert: 10.3.2011 12:34:40 von fabo
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Kannst du sicher gehen, dass ein [a] immer mit einem [/a] geschlossen wird?

    Eine sehr einfache Lösung wäre die Suche nach dem "[a]" mit substr_count().
  4. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    An substr_count() habe ich auch schon gedacht. Im Normalfall wird [a] immer mit einem [/a] geschlossen. Im sehr seltenen Fall ist dem jedoch nicht so.
  5. Könnte man den Fall nicht beim Speichern schon unterbinden?
    Es sollten keine Fehler in den Daten sein ;)

    Theoretisch könntest du auch noch die [/a] zählen und wenn diese kleiner sind....
  6. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Naja, unterbinden ist so eine Sache. Siehe deine Posts als Beispiel. Du erklärst etwas und öffnest während deiner Erklärung den a-Tag, ohne ihn zu schließen ;)

    EDIT:

    Ich benutze jetzt substr_count. Tut, was es soll. Dafür hab ich mich in meinem Script schon wieder so verhaspelt, dass ich die Logik nicht mehr rein kriege :(

    Beitrag zuletzt geändert: 10.3.2011 13:18:40 von fabo
  7. Das Problem an deinen urprünglichen Ansatz war übrigens nur ein fehlendes Fragezeichen.
    $count = 0;
    while ($row .....)) {
    $count += preg_match_all('~\[a].*?\[/a]~i', $row['message'], $matches);
    }
    
    echo $count;

    Das Fragezeichen hinter dem `.*` macht das ganze ungreedy, d.h. PCRE matcht nicht den längsten möglichen String (der ja von dem ersten [a] bis zum allerletzten [/a] gehen würde), sondern den kürzesten.

    Beitrag zuletzt geändert: 10.3.2011 16:03:34 von nikic
  8. Autor dieses Themas

    fabo

    fabo hat kostenlosen Webspace.

    Ich sollte mir abgewöhnen, die kompliziertesten Dinge dann erledigen zu wollen, wenn ich die Nacht nicht gepennt hab. Da kommt nur Käse raus. Danke soweit ;) Ich werds ausklamüsern, wenn ich wieder wach bin.
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!