2016-03-28 55 views
6

我在PHP下面的数组:定期对特定字母之前或之后发现的信件表达

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

我想搜索一个单词,它下面的轮廓相匹配:

  • 第一个字母可以是任何形式a-z
  • 第二个字母必须与第一个字母相同或者在第一个字母之后(即如果第一个字母是p,则第二个字母必须是p或af之三它在字母表)
  • 第三个字母必须是相同的信作为,或第二个字母后
  • 的第四个字母必须是第三个字母
  • 第五信必须是第四个字母之前前

有没有什么办法可以创建一个可以匹配上述条件的正则表达式?这将是最好的,因为我也希望在MySQL中创建一个实现,所以正则表达式将更容易转移到新的情况。

+0

我创建了以下内容,它只能工作到第三个字母。第四和第五有错误。希望你能看到我想要做的逻辑...... [DEMO](https://regex101.com/r/nH2fJ7/1) – Druzion

+0

你可以使用['ord()'](http:// php.net/manual/en/function.ord.php)[[demo]](https://eval.in/543423)来比较[ASCII值](http://www.ascii-code.com/ )。在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]) # First Letter 
([\1-z]) # Second Letter 
([\2-z]) # Third Letter 
([a-\3]) # Fourth Letter 
([a-\4]) # Fifth Letter 

但是,您不能使用a-z而动态地设置az到先前拍摄的群体之一。您可以使用PHP连接来创建RegEx,但是这需要至少4行代码,除了第一个字母外。

+0

非常感谢! – think123