考虑一下,
$uri = '/post/search/foo';
$pattern = '~/post/search/[A-Za-z0-9_-]+(?=/|$)~i';
$matches = array();
preg_match($pattern, $uri, $matches);
print_r($matches); // Success
它工作正常,因为[A-Za-z0-9_-]
属于foo
。因为我正在写一个路由插件,
我希望它能够与特殊字符匹配。
我想象一个正则表达式模式是这样的:
[A-Z0-9!@#$%^&*()_+|\/?><~"№;:'*]+(?=/|$)
我尝试用斜杠转义每个特殊字符,并使用preg_quote()
转义整个模式但没有运气 - 我总是遇到编译失败。
问题是,应该如何正确匹配A-Z0-9!@#$%^&*()_+|\/?><~"№;:'*
?
答案 0 :(得分:2)
您是否有理由不想使用不合格的.
?
如:
'~/post/search/.+(?=/|$)~iU'
答案 1 :(得分:2)
在角色类内逃避并不困难,只有^
(仅在第一个位置),-
(不在第一个或最后一个位置),\
和{{1那里是特殊字符,[]
是字符串分隔符。另外还有正则表达式分隔符。
您使用'
作为正则表达式分隔符,我认为这是您的角色类中的关键点,因为使用~
时默认情况下不会对分隔符进行转义。
所以这应该有效
preg_quote()