用于“字符串或模式的开头”的PHP正则表达式

时间:2013-05-09 11:01:12

标签: php regex preg-match

有没有办法(除了做两个单独的模式匹配)在PHP中使用preg_match来测试字符串的开头或模式?更具体地说,我经常发现自己想要测试我有一个匹配的模式,前面没有东西,如

preg_match('/[^x]y/', $test)

(也就是说,如果它前面没有x,则匹配y),但如果它出现在$ test的开头,那么它也匹配y(当它也没有前面的x时,但前面没有任何前缀字符,所以[^ x]构造不起作用,因为它总是需要一个字符来匹配它。

在字符串的末尾有一个类似的问题,以确定是否发生了一个未跟随其他模式的模式。

3 个答案:

答案 0 :(得分:6)

您可以简单地使用标准的交替语法:

/(^|[^x])y/

这将匹配输入开头之前的yx以外的任何字符。

当然在这个特定的例子中,^锚点的替代方法非常简单,你也可以很好地使用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.