4

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

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

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

在字符串的末尾有一个类似的问题,以确定是否出现了没有被其他模式遵循的模式。

4

3 回答 3

8

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

/(^|[^x])y/

这将匹配以y输入开头或除 以外的任何字符开头的a x

当然,在这个特定的例子中,^锚的替代方法非常简单,你也可以很好地使用否定的lookbehind

/(?<!x)y/
于 2013-05-09T11:03:00.810 回答
1
$name = "johnson";
preg_match("/^jhon..n$/",$name);

^ 定位到字符串的开头,$ 定位到字符串的结尾

于 2013-05-09T13:35:26.343 回答
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

假设您希望凝视不以“开始”开头并以“结束”字符串结尾:-

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.
于 2013-05-09T11:48:29.180 回答