添加特殊字符时,正则表达式匹配失败

时间:2013-09-19 08:00:12

标签: php regex

考虑一下,

$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!@#$%^&*()_+|\/?><~"№;:'*

2 个答案:

答案 0 :(得分:2)

您是否有理由不想使用不合格的.

如:

'~/post/search/.+(?=/|$)~iU'

答案 1 :(得分:2)

在角色类内逃避并不困难,只有^(仅在第一个位置),-(不在第一个或最后一个位置),\和{{1那里是特殊字符,[]是字符串分隔符。另外还有正则表达式分隔符。

您使用'作为正则表达式分隔符,我认为这是您的角色类中的关键点,因为使用~时默认情况下不会对分隔符进行转义。

所以这应该有效

preg_quote()