有没有办法(除了做两个单独的模式匹配)在PHP中使用preg_match来测试字符串的开头或模式?更具体地说,我经常发现自己想要测试我有一个匹配的模式,前面没有东西,如
preg_match('/[^x]y/', $test)
(也就是说,如果它前面没有x,则匹配y),但如果它出现在$ test的开头,那么它也匹配y(当它也没有前面的x时,但前面没有任何前缀字符,所以[^ x]构造不起作用,因为它总是需要一个字符来匹配它。
在字符串的末尾有一个类似的问题,以确定是否发生了一个未跟随其他模式的模式。
答案 0 :(得分:6)
您可以简单地使用标准的交替语法:
/(^|[^x])y/
这将匹配输入开头之前的y
或x
以外的任何字符。
当然在这个特定的例子中,^
锚点的替代方法非常简单,你也可以很好地使用negative lookbehind:
/(?<!x)y/
答案 1 :(得分:1)
$name = "johnson";
preg_match("/^jhon..n$/",$name);
^定位于开始 和 $是位于字符串
的结尾答案 2 :(得分:0)
You need following negate rules:-
--1--^(?!-) is a negative look ahead assertion, ensures that string does not start with specified chars
--2--(?<!-)$ is a negative look behind assertion, ensures that string does not end with specified chars
假设你想盯着不以'start'开头并以'end'字符串结尾: -
Your Pattern is :
$ pattern ='/ ^(?!x)([a-z0-9] +)$(?
$pattern = '/^(?!start)([a-z0-9]+)$(?<!end)/';
$strArr = array('start-pattern-end','allpass','start-pattern','pattern-end');
foreach($strArr as $matstr){
preg_match($pattern,$matstr, $matches);
print_R( $matches);
}
This will output :allpass only as it doen't start with 'start' and end with 'end' patterns.