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

Php 添加特殊字符时正则表达式匹配失败,php,regex,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。因为我在写一个路由插件, 我希望这是缩写,以配合特殊字符以及 我想象一个正则表达式模式是这

想想这个,

$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!@$%^&*()有什么原因你不想只使用ungreedy

例如:

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

您不想只使用ungreedy
,有什么原因吗

例如:

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

在字符类内部转义并不困难,只有
^
(仅在第一个位置),
-
(不在第一个或最后一个位置),
\
[]
是特殊字符,而
'
是字符串分隔符。另外还有regex分隔符

您使用
~
作为正则表达式分隔符,我认为这是字符类中的关键点,因为在使用
preg_quote()
时,默认情况下不会转义分隔符

所以这应该是可行的

[A-Z0-9!@#$%^&*()_+|\/?><\~"№;:\'*]+(?=/|$)

[A-Z0-9!@$%^&*()在字符类内转义并不困难,只有
^
(仅在第一个位置)、
-
(不在第一个或最后一个位置)、
\
[]
是特殊字符,而
是字符串分隔符。另外还有regex分隔符

您使用
~
作为正则表达式分隔符,我认为这是字符类中的关键点,因为在使用
preg_quote()
时,默认情况下不会转义分隔符

所以这应该是可行的

[A-Z0-9!@#$%^&*()_+|\/?><\~"№;:\'*]+(?=/|$)

[A-Z0-9!@$%^&*()但是,
+
部分在
$
之前不总是匹配吗?不会跳过它们之间的所有斜杠吗?@Birei如果有斜杠,则为“U”标志)将结束
+
匹配抱歉。我当时不知道这个选项。我以为这是用
+?
完成的,就像在大多数其他语言中一样。但是,
+
部分在
$
之前不总是匹配吗?不会跳过它们之间的所有斜杠吗?@Birei如果有斜杠,则为“U”标志)将结束
+
比赛抱歉。我不知道这个选项。我以为这是用
+?
完成的,就像其他大多数语言一样。