preg_match管道标志

时间:2012-12-14 12:16:49

标签: regex preg-match

我有一个正则表达式

|^(/[a-z]{2})?/?(php)/([-a-z0-9]+)/?/?$|

匹配/php/anything

现在我想要一个与

匹配的正则表达式
/php/anything
/java/anything

我累了|^(/[a-z]{2})?/?(php|java)/([-a-z0-9]+)/?/?$|,但它没有用。

有人可以帮我解决问题吗? 我想保留所有其他部分,但只更改(php)部分。

这是代码

preg_match("|^(/[a-z]{2})?/?(php|java)/([-a-z0-9]+)/?/?$|", 'php/anything')

但是我得到了这个警告并且匹配不起作用

Warning: preg_match(): Unknown modifier 'j' 

由于

2 个答案:

答案 0 :(得分:1)

问题只是你使用管道标志作为界定你的模式的字符。因此,您需要在模式本身内转义管道符号,或者只需将分隔符更改为您不会在模式中使用的其他内容:

#^(/[a-z]{2})?/?(php|java)/([-a-z0-9]+)/?/?$#
{^(/[a-z]{2})?/?(php|java)/([-a-z0-9]+)/?/?$}

答案 1 :(得分:1)

您正在使用|作为正则表达式分隔符,但您在正则表达式中有一个|作为更改,您需要将其转义。如果不这样做,则将第二个|视为正则表达式的结尾,并将其后面的字母j视为正则表达式修饰符。由于j不是有效的修饰符,因此会出现错误。

您将|转义为:

preg_match("|^(/[a-z]{2})?/?(php\|java)/([-a-z0-9]+)/?/?$|", 'php/anything')
                                ^

或者你可以使用另一对分隔符:

preg_match("~^(/[a-z]{2})?/?(php|java)/([-a-z0-9]+)/?/?$~", 'php/anything')
            ^                                           ^