2011-06-28 24 views
2

PHPのpreg_replaceを使用して、最初の2つの後にすべての文字とスペースを置き換えようとしています。私はちょうど括弧([a-zA-Z ])で部品を交換しようとしているPHP正規表現のヘルプ

echo preg_replace('/^[a-zA-Z]{2}([a-zA-Z ])*.*$/i','','FALL 2012'); //expected output is "FA2012", but it outputs nothing 

..私は推測している私はちょうどその部分を置き換える右にそれをやっていないよ...

:ここではそうすることで私の失敗した試みがあります

答えて

2

文字列全体を置換するよう求めています。代わりに最初の2文字と一致させるにはlookbehindを使用してください。ところで

echo preg_replace('/(?<=^[a-z]{2})[a-z ]*/i','','FALL 2012'); 

i修飾子は、大文字と小文字を区別しませんですので、あなたは、大文字と小文字の両方に一致する必要はないことを意味します。

+1

あなたはpreg_match/preg_replaceを後方に持っていると思います。 preg_replaceは置換でグループ化を使用します。 $ 1は最初のグループ、$ 2は2番目のグループ...などです。 –

+1

この式は?(=?の代わりに?<)ですが、対象の開始前に文字が存在しない可能性があるため、何も一致しません(^ lookbehindに含める必要があります)。 – jaytea

+0

@Jonathan:そうです。コーヒーが十分ではありません。私の答えのその部分を削除しました。 –

0

最後に/iは大文字小文字を区別しません。 (?<=regex)は、行の先頭の現在の位置の直前を2文字で表示します。

echo preg_replace('/(?<=^[a-z]{2})[a-z ]*/i','','FALL 2012'); 
0

あなたは、マッチ全体を空白( '')に置き換えると言っています。あなたは保持したい部分の周りに括弧を入れて、最初の($1)と括弧のセット($2)にあるものと等しい$ 1 $ 2で置き換えたいとします。

preg_replace("/^([a-z]{2})[a-z\s]*(.*)$/i", '$1$2', $string); 
0

この場合、(?<=lookbehind)で取得できます。しかし、他の場合には\ Kエスケープがより適しているかもしれません。それがするのは、アプリケーションによって渡された開始オフセット値をサブジェクトの現在の位置にリセットし、実際に現在のマッチで消費された文字列の部分を実質的にダンプします。例:

preg_replace('^[a-z]{2}\K[a-z ]*/i', '', 'FALL 2012') 

[a-z ]*に一致する部分文字列のみが置換されます。