我刚注意到我的应用中存在一个错误。
在我的表中,我存储正则表达式模式并将它们与输入匹配。
在表格中,我存储了'/'模式(它是测试数据)。
在php中使用'/',我有以下代码
$input = '/something';
$pattern = '/'.str_replace('/', '\/', $pattern).'/';
preg_match($pattern, $input, $matches);
为什么我在这种情况下得到一个匹配?我该如何预防?
答案 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);