2012-04-09 16 views
0

für Wort in String suchen Wie i Wort in Zeichenfolge gefunden können regex oder nicht in dieser Zeichenfolge mitphp und regex:

String ist Mysql Abfrage

SELECT 
    id, 
    name, 
    desc, 
    (SELECT id as lid FROM comments WHERE lid = id order by id desc limit 1) as lid_com 
FROM posts limit 3 

hier i für suchen möchten begrenzen in der letzten Zeichenfolge

String sein kann

limit 3 
    limit 3, 3 
    limit 3 , 3 
    limit 3 ,3 

3 hier kann eine beliebige Zahl sein

ich diese Regex versucht, aber ich bin Anfänger

„/ Begrenzung [0-9] {0,9} + \, [0-9] { 0,9}/i $“

, wie ich dies tun kann

Danke

+0

sein kann Abfrage nicht vaild mysql query ist, aber ich hinzugefügt, um es mit Unterabfrage wth Wort zu begrenzen, enthält here Abfrage 2 Worte Grenze^-^ –

+0

würde diese Frage: "Wie finde ich das erste Wort einer Zeichenfolge?" Passt besser zu dem, wonach Sie suchen? – FailedDev

+0

@FailedDev Ja, ich möchte es in der Hauptabfrage nicht in der Unterabfrage –

Antwort

1
$string = 'SELECT 
    id, 
    name, 
    desc, 
    (SELECT id as lid FROM comments WHERE lid = id order by id desc limit 1) as lid_com 
FROM posts limit 3 ,3'; 

echo preg_match('/(limit)\s\d(((\,\s)|(\s\,\s)|(\s\,))\d)?$/i', $string, $matches); //1 
print_r($matches); //$matches['0'] == 'limit 3 ,3' 
+0

Vielen Dank @lng, Ihre Regex funktioniert gut, aber nicht mit diesem 'Limit 3,3' –

+0

Jetzt ist es gut nach Regex zu'/(Grenze) \ s \ d (((\, \ s) | (\ s \, \ s) | (\ s \,)) \ d)? $/i', aber als @kirilloid sagte Limit ist nicht immer letzte Anweisung http://dev.mysql.com/doc/refman/ 5.0/de/select.html, das wird etwas mehr Arbeit brauchen :) –

+0

Nimm einfach das '$' heraus, damit die Regex irgendwo in der Zeichenkette passt, nicht nur auf das Ende :) – Ing

1
"/limit[\s]+[\d]+[\s]*,[\s]*[\d]+$/i" 

Dies sucht Fall insesitive für:

  • "limit"
  • ein oder mehrere Leerzeichen
  • eine oder mehrere Ziffern
  • null oder mehr Leerzeichen
  • ein Komma
  • null oder mehr Leerzeichen
  • eine oder mehrere Ziffern
  • am Ende der Zeichenfolge
+0

finden vielleicht 'Beiträge' vor 'Limit' hinzufügen, nur um das zweite Vorkommen –

+0

nicht funktionieren (ohne Kommentar zu Ihrer Antwort), und ich werde nicht kontrollieren query :( –

1

mich nicht erinnern, ob LIMIT ist immer eine letzte SQL-Anweisung, so würde ich

/limit\s+(\d+)(?:\s*,\s*(\d+))?(?=[^\n]+\Z)/mi 
+0

Vielen Dank für die Antwort. aber diese Regex funktioniert auch mit der Unterabfrage? Ich möchte es in der Hauptabfrage überprüfen nur nicht Unterabfragen –

+0

Es entspricht nur diese 'limit' Anweisung, die in der letzten Zeile befindet. Das Analysieren von beliebigem SQL-Code mit Regexes ist keine gute Idee. – kirilloid

+0

Was ist der beste Weg, SQL-Code zu analysieren und mein Problem zu lösen –

0

Versuchen Sie, diese Bedingung verwenden -

SELECT * FROM table WHERE column 
    REGEXP '(^limit[[:space:]]+[[:digit:]]+[[:space:]]*,[[:space:]]*[[:digit:]]+$)|(^limit[[:space:]]+[[:digit:]]+[[:space:]]*$)'; 

Der erste Teil-Strings finden wie 'Grenze 3,3' -

^limit[[:space:]]+[[:digit:]]+[[:space:]]*,[[:space:]]*[[:digit:]]+$ 

Die zweiten Zeichenkette wie ‚Grenze 3‘ findet -

^limit[[:space:]]+[[:digit:]]+[[:space:]]*$