为什么/匹配/某事


Why does / matches /something?

我刚刚注意到我的应用程序中有一个错误。

在我的表中,我存储正则表达式模式,并将它们与输入进行匹配。

在表中,我存储了"/"模式(它是测试数据)。

要在php中使用"/",我有以下代码

$input = '/something';
$pattern = '/'.str_replace('/', ''/', $pattern).'/';
preg_match($pattern, $input, $matches);

为什么在这种情况下我要匹配?我该如何预防?

preg_match查找子字符串。如果你想匹配整个字符串,你需要用^$来锚定它。也许:

$pattern = '/^(?:'.str_replace('/', ''/', $pattern).')$/';

^$锚定匹配,与()分组确保正则表达式中的任何|不会被误解,并且?:防止组向$matches添加条目。

顺便说一句,将分隔符更改为其他内容的建议没有切中要害:您必须有某种分隔符,并且需要转义该分隔符。如果您将/切换为!,那么您可能会遇到!问题。这不会解决问题。

您之所以得到匹配,是因为您基本上是在'/字符串中查找/子字符串。它就在那里。所以你得到了匹配。我建议将模式的开头和结尾标记替换为!,以避免/字符出现任何问题。所以,试试这个:

preg_replace('!'.$pattern.'!', $input, $matches);

或者,如果你无论如何都想逃离模式,只需使用preg_quote():

preg_replace('/'.preg_quote($pattern, '/').'/', $input, $matches);