为什么/匹配/什么?

时间:2015-10-28 23:53:20

标签: php regex

我刚注意到我的应用中存在一个错误。

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

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

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

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

为什么我在这种情况下得到一个匹配?我该如何预防?

2 个答案:

答案 0 :(得分:1)

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

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

^$锚定匹配,与()分组,确保正则表达式中的任何|都没有被误解,?:阻止小组向$matches添加条目。

顺便说一句,将分隔符更改为其他内容的建议忽略了这一点:您必须使用某种分隔符,并且需要对分隔符进行转义。如果您将/切换为!,那么您可能会遇到!问题。它不会解决问题。

答案 1 :(得分:-1)

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

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

或者,如果您想要逃避模式,请使用preg_quote()

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