PHP正则表达式 - 匹配字符串的开头和结尾

3

我使用了一个在线的正则表达式测试工具来构建一个简单的正则表达式,但是在使用PHP的preg_match时,它会报出一个未知的修饰符$

这是正则表达式:

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

我正在尝试检查 $input 是否完全等于 Keyword1/ 或 Keyword2/。我知道可以使用 "if ($input == 'Keyword1/')" 轻松实现此目的,但与在代码中使用十几个 if 语句相比,我宁愿使用几行正则表达式。如何解决这个问题?

1
请注意,您还可以使用允许的关键字数组和 in_array - user180100
3个回答

6

在正则表达式中,由于 / 也用作分隔符,因此需要转义 /

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

另外,您可以使用其他分隔符:

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

由于你的两个子正则表达式具有共同的锚点,因此可以将你的正则表达式简化为:

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

为什么你的正则表达式会出现警告?
'/(^Keyword1/$|^Keyword2/$)/'

由于您使用/作为分隔符,因此正则表达式中的第二个/使PHP认为它是正则表达式的结尾。现在,PHP接受类似smi这样的正则表达式修饰符,在结束分隔符后。但在您的情况下,PHP在结束分隔符后看到了一个$。由于$不是有效的修饰符,您会收到警告:

PHP Warning: preg_match(): Unknown modifier '$' in ...


1
问题在于您在正则表达式中使用了 / 但没有进行转义。
这是您要查找的内容,但可能更好的写法是:
'/^(Keyword1|Keyword2)\\/$/'

1

使用:

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

"[12]"会做同样的事情,但我要假定"keyword1"只是一个例子,并不是他正在寻找的实际字符串。 - nickf

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接