4

PHP で preg_match を使用して文字列またはパターンの開始をテストする方法はありますか (2 つの個別のパターン マッチを行う以外に) はありますか? より具体的には、次のように、何かが先行していない一致するパターンがあることをテストしたいと思うことがよくあります。

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

(つまり、x が前にない場合は y に一致します)、$test の開始時に発生する場合は y にも一致します (x が前になく、文字が前にない場合、したがって、 [^x] コンストラクトは、一致する文字が常に必要なため機能しません。

文字列の最後にも同様の問題があり、他のパターンが続かないパターンが発生するかどうかを判断します。

4

3 に答える 3

8

標準の代替構文を使用するだけです。

/(^|[^x])y/

yこれは、入力の開始または 以外の任意の文字が先行する a に一致しますx

もちろん、この特定のインスタンスでは、アンカーの代替手段が非常に単純なので、否定的な後読み^をうまく使用することもできます。

/(?<!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

'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.
于 2013-05-09T11:48:29.180 に答える