2011-11-26 90 views
2

我使用了一个在线正则表达式测试器来构建一个简单的正则表达式,但是使用php的preg_match它给出了一个未知的修饰符$。php正则表达式 - 从字符串的开始和结尾匹配

这里是正则表达式:

if (preg_match('/(^Keyword1/$|^Keyword2/$)/', $input, $matches)) 

我试图做的是检查,如果$输入等于或者关键字1 /或关键字2 /(精确匹配)。我知道我可以很容易地用“if($ input =='Keyword1 /')”做到这一点,但我宁愿有几行正则表达式与代码中的一打if语句。

有人帮我解决吗?

+1

注意,你也可以使用关键字允许的数组和'in_array' – 2011-11-26 12:32:41

回答

4

你需要躲避正则表达式内/,因为/也被用来作为分隔符:

if (preg_match('/(^Keyword1\/$|^Keyword2\/$)/', $input, $matches)) 
         ^  ^

或者使用不同的分隔符:

if (preg_match('~(^Keyword1/$|^Keyword2/$)~', $input, $matches)) 
       ^      ^

因为两个你子regexs有共同的锚你可以简化你的正则表达式为:

if (preg_match('~^(Keyword1|Keyword2)/$~', $input, $matches)) 

为什么在你的正则表达式中的警告?

'/(^Keyword1/$|^Keyword2/$)/' 

由于您使用/作为分隔符,第二/在你的正则表达式使得PHP认为这是你的正则表达式的结束。现在PHP在结束分隔符后接受正则表达式修饰符,如s,m,i。但在你的情况下,PHP在结束分隔符后看到一个$。由于$是不是一个有效修改你得到警告:

PHP的警告:的preg_match():未知的修饰 '$' 在...

+0

正是我需要的,谢谢! – Joe

1

的问题是,你使用的/在你的正则表达式中,而不是逃避它。

这里就是你要找的东西,但也许更好一点:

'/^(Keyword1|Keyword2)\\/$/' 
1

什么:

preg_match('/^Keyword[1-2]\/$/', $input, $matches) 
+0

'[12]'会做同样的事情,但我会假定“keyword1”只是一个例子,而不是他正在寻找的* actual *字符串。 – nickf

+0

@nickf是的没错 – 2011-11-26 12:30:31

相关问题