Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/234.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 查找某个字母之前或之后的字母的正则表达式_Php_Mysql_Regex_String - Fatal编程技术网

Php 查找某个字母之前或之后的字母的正则表达式

Php 查找某个字母之前或之后的字母的正则表达式,php,mysql,regex,string,Php,Mysql,Regex,String,我在PHP中有以下数组: $words = array("apple", "banana", "lemon"); 我要搜索与以下配置文件匹配的单词: 第一个字母可以是任何a-z 第二个字母必须与第一个字母相同或在第一个字母之后(即,如果第一个字母是p,则第二个字母必须是p,或在字母表中位于其之后) 第三个字母必须与第二个字母相同,或在第二个字母之后 第四个字母必须在第三个字母之前 第五个字母必须在第四个字母之前 有没有办法创建一个可以匹配上述条件的正则表达式?这将是最好的,因为我也希望在M

我在PHP中有以下数组:

$words = array("apple", "banana", "lemon");
我要搜索与以下配置文件匹配的单词:

  • 第一个字母可以是任何
    a-z
  • 第二个字母必须与第一个字母相同或在第一个字母之后(即,如果第一个字母是
    p
    ,则第二个字母必须是
    p
    ,或在字母表中位于其之后)
  • 第三个字母必须与第二个字母相同,或在第二个字母之后
  • 第四个字母必须在第三个字母之前
  • 第五个字母必须在第四个字母之前

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

我想出了一种不用正则表达式的方法,但是您的条件仍然是匹配的:

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

如果要使函数变得非常小,可以使用以下方法:

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
动态设置为先前捕获的组之一时,不能使用
a-z
。您可以使用PHP连接来创建正则表达式,但是除了第一个字母外,每个字母至少需要4行代码。

我创建了下面的代码,它最多只能使用第三个字母。第四个和第五个有错误。希望你能看到我在做什么的逻辑。。。您可以使用like in进行比较。在MySQL中可以添加,但可能需要一些努力。使用MySQL正则表达式,我认为这是不可行的。
^([a-z])    # First Letter
([\1-z])    # Second Letter
([\2-z])    # Third Letter
([a-\3])    # Fourth Letter
([a-\4])    # Fifth Letter