2016-03-28 10 views
6

Ho la seguente array in PHP:espressione regolare per trovare le lettere prima o dopo una certa lettera

$words = array("apple", "banana", "lemon"); 

voglio cercare una parola, in cui corrisponde il seguente profilo:

  • La prima lettera può essere qualsiasi cosa a-z
  • La seconda lettera deve essere la stessa lettera o dopo la prima lettera (cioè se la prima lettera era p, la seconda lettera deve essere p o af ter nella alfabetico)
  • La terza lettera deve essere la stessa lettera, o dopo la seconda lettera
  • La quarta lettera deve precedere la terza lettera
  • La quinta lettera deve precedere la quarta lettera

Esiste un modo per creare un'espressione regolare che possa corrispondere alle condizioni di cui sopra? Questo sarebbe il migliore, visto che sto cercando di creare un'implementazione in MySQL, quindi le espressioni regolari sarebbero più trasferibili alla nuova situazione.

+0

Ho creato quanto segue e funziona solo fino alla terza lettera. Il 4 ° e il 5 hanno errori. Spero che tu possa vedere la logica in quello che sto cercando di fare ... [DEMO] (https://regex101.com/r/nH2fJ7/1) – Druzion

+0

Puoi usare ['ord()'] (http: // php.net/manual/en/function.ord.php) come in [questa demo] (https://eval.in/543423) per confrontare [valori ASCII] (http://www.ascii-code.com/). In MySQL [funzioni personalizzate] (http://dev.mysql.com/doc/refman/5.7/en/adding-functions.html) può essere aggiunto ma probabilmente ci sarà un certo sforzo. Con regex di MySQL penso che non sia fattibile. –

risposta

6

mi si avvicinò con un modo per farlo senza RegEx, tuttavia saranno ancora abbinati vostre condizioni:

function my_func($str) { 
    $letters = 'abcdefghijklmnopqrstuvwxyz'; 

    $match = true; // Will be set to false if does not match conditions 

    $l1pos = strrpos($letters, $str[0]); 
    $l2pos = strrpos($letters, $str[1]); 
    $l3pos = strrpos($letters, $str[2]); 
    $l4pos = strrpos($letters, $str[3]); 
    $l5pos = strrpos($letters, $str[4]); 

    // If letter 2 comes before letter 1 
    if ($l2pos < $l1pos) { $match = false;} 

    // If letter 3 comes before letter 2 
    if ($l3pos < $l2pos) { $match = false; } 

    // If letter 4 comes after letter 3 
    if ($l4pos >= $l3pos) { $match = false; } 

    // If letter 5 comes after letter 4 
    if ($l5pos >= $l4pos) { $match = false; } 

    return $match; 
} 

Si può usare in questo modo:

$string = 'apple'; 

if (my_func($string)) { 
    print 'Matched!'; 
} 
else { 
    print 'Not Matched. :('; 
} 

Se desidera rendere la funzione veramente piccola, è possibile utilizzare il seguente:

function my_func($str) { 
    $letters = 'abcdefghijklmnopqrstuvwxyz'; 
    $match = true; 
    function m($i) { 
     return strrpos($letters, $str[$1]); 
    } 
    if ((m(1) < m(0)) || (m(2) < m(1)) || (m(3) >= m(2)) || (m(4) >= m(3))) { 
     $match = false; 
    } 
    return $match; 
} 

ho anche sperimentare una RegEx, ed ha ottenuto la seguente:

^([a-z]) # First Letter 
([\1-z]) # Second Letter 
([\2-z]) # Third Letter 
([a-\3]) # Fourth Letter 
([a-\4]) # Fifth Letter 

Tuttavia, non è possibile utilizzare a-z mentre dinamicamente l'impostazione a o z ad uno dei gruppi catturati precedenti. È possibile utilizzare la concatenazione PHP per creare una RegEx, tuttavia ciò richiederebbe almeno 4 righe di codice, per ogni lettera ma la prima.

+0

Grazie mille! – think123

Problemi correlati