我在 PHP 中有以下数组:
$words = array("apple", "banana", "lemon");
我想搜索一个与以下配置文件匹配的词:
- 第一个字母可以是任何
a-z
- 第二个字母必须与第一个字母相同或在第一个字母之后(即,如果第一个字母是
p
,则第二个字母必须是p
或在第一个字母之后它在字母表中) - 第三个字母必须与第二个字母相同或在第二个字母之后
- 第四个字母必须在第三个字母之前
- 第五个字母必须在第四个字母之前
有什么方法可以创建一个可以满足上述条件的正则表达式吗?这将是最好的,因为我还希望在 MySQL 中创建一个实现,这样正则表达式将更容易转移到新情况。
最佳答案
我想出了一个不用 RegEx 的方法,但是你的条件仍然会匹配:
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
动态设置为先前捕获的组之一时,您不能使用 a-z
。您可以使用 PHP 连接来创建一个 RegEx,但是这至少需要 4 行代码,每个字母除了第一个字母。
关于php - 用于查找某个字母之前或之后的字母的正则表达式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36260293/