2016-03-28 29 views
6

I持ってPHPの以下の配列:正規表現

  • :私はそれは次のプロファイルに一致する単語を検索したい

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

    最初の文字は何でもかまいませんa-z

  • 2文字目は最初の文字と同じ文字でなければなりません(つまり、最初の文字がpだった場合、2番目の文字はpまたはafアルファベットでそれTER)
  • 第四の文字が第五の文字は第文字
  • 前でなければならない3番目の文字
  • 前でなければならないように、または第二の文字
  • 後の3番目の文字が同じ文字である必要があります

上記の条件に一致する正規表現を作成する方法はありますか?これは、MySQLで実装を作成したいので、正規表現が新しい状況に移行する可能性が高いので、最適です。

+0

私は以下を作成しましたが、それは3文字目までしか動作しません。 4番と5番にはエラーがあります。うまくいけば、私がしようとしていることに論理を見ることができたら···[DEMO](https://regex101.com/r/nH2fJ7/1) – Druzion

+0

['ord()'](http:// [このデモ](https://eval.in/543423)の[ASCII値](http://www.ascii-code.com/)のような[php.net/manual/en/function.ord.php] )。 MySQLでは[カスタム関数](http://dev.mysql.com/doc/refman/5.7/en/adding-functions.html)を追加できますが、多少の努力が必要です。 MySQLの正規表現では、私はそれができないと思う。 –

答えて

6

しかし私は、あなたの条件がまだ一致します、正規表現せずにそれを行うための方法を思い付いた:

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; 
} 

あなたがそうのようにそれを使用することができます:あなたの場合は

$string = 'apple'; 

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

関数を実際に小さくしたい場合は、以下を使用することができます。

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; 
} 

私はまた、次の正規表現を試し、そして得なかった:動的に前のキャプチャグループのいずれかにaまたはzを設定しながら

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

しかし、あなたはa-zを使用することはできません。 PHPの連結を使ってRegExを作成することもできますが、これは最初の1文字ごとに少なくとも4行のコードを必要とします。

+0

ありがとうございました! – think123