preg_split count
lima-city → Forum → Programmiersprachen → PHP, MySQL & .htaccess
ansatz
code
erledigen
fehlendes fragezeichen
folgendes szenario
fragezeichen
lager
logik
machen
match
message
normalfall
schlauch
sicher gehen
speichern
suche
tabelle
tag
vorhaben
vorkommnis
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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(). -
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.
-
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.... -
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 -
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 -
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.
-
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage