PHP 正则表达式在应该表现的时候不会贪婪


PHP Regex not behaving greedily when it should

我有一个潜在的非常大的提交类型输入按钮列表,这些按钮名为 delete0delete1delete2 等,我正在尝试使用 preg_match 来匹配$_POST数组中单击的按钮并梳理出附加的数字,以便我可以从 mysql 表中删除该数字。

问题是我的preg_match并没有在看起来应该的时候表现得贪婪。例如,如果我使用按钮提交 delete13 ,我将获得delete1的匹配项,delete23将获得delete2的匹配项,等等。

以下是我的模式和逻辑:

$pattern = "/,?(delete)('d)+,?/";
$allpostkeys = implode(",", array_keys($_POST));
echo "<br />" . $allpostkeys . "<br />";
if (preg_match($pattern, $allpostkeys, $matches))
{
    echo "<br />You elected to delete row: " . $matches[2];
    $rowToDelete = $matches[2];
}

更改

$pattern = "/,?(delete)('d)+,?/";

$pattern = "/,?(delete)('d+),?/";

小修复:

/,?(delete)('d+),?/

您正在捕获正在重复的模式:('d)+ ,因此捕获组中只应保留上次重复的子字符串(单个数字)。 ('d+)将捕获子字符串,其中包含所有重复的数字。

作为进一步的改进,第一个捕获组不是必需的:

/,?delete('d)+,?/

所以你可以用matches[1]来指delete后的数字