2011-10-05 9 views
45

私はこのコードを持ってするpreg_matchてはいけません。区切り文字は英数字またはバックスラッシュことと

$string1 = "My name is 'Kate' and im fine"; 
$pattern = "My name is '(.*)' and im fine"; 
preg_match($pattern , $string1, $matches); 
echo $matches[1]; 

とイムが実行したとき、それは、このエラーが返されます。

Warning: preg_match() [function.preg-match]: Delimiter must not be alphanumeric or backslash

+0

これはほぼ確実に同じエラーが表示されるためです。 – bluebinary

答えて

86

あなたはあなたのパターンの区切り文字を必要とします。そうのようなパターンの開始時と終了時に追加する必要があります。

$pattern = "/My name is '(.*)' and im fine/"; // With/as a delimeter 
+1

これは正解でなければなりません。 –

1

あなたはあなたの表現の区切り文字を指定する必要があります。この

$pattern = "/My name is '\(.*\)' and im fine/"; 
+0

なぜ括弧がエスケープされますか? –

18

てみてください。区切り文字は、式の始まりと終わりに使用される特殊文字です。これにより、修飾子とインタプリタを使用して、どちらが式であり修飾子であるかを知ることができます。バックスラッシュがエスケープ文字であるため、エラーメッセージに示すように、デリミタはバックスラッシュにすることはできません。

$pattern = "/My name is '(.*)' and im fine/"; 

と同じ例以下が、大文字と小文字が区別されることなく一致するようにi改質剤です。

$pattern = "/My name is '(.*)' and im fine/i"; 

あなたが見ることができるように、iはスラッシュの外にあるため、修飾子として解釈されます。

また、スラッシュ文字(/)を区切り記号として使用する場合は、正規表現内に/がある場合はそれ以降の使用をエスケープする必要があることにも注意してください。

29

解決策(これは私が最初に書いたときに少なくとも—は言及していません)は、PHPがデリミタを参照するときに、コードに表示されている区切り文字)が文字列内の次の文字になります。 (実際に私は、これはどこでも任意のドキュメントに記載さ見たことがありません:あなたは例でそれを参照する必要があります)ので、代わりにあなたが他の多くの言語からに慣れすることができるものをのような正規表現の構文を持つ:

/something/ 

PHPは文字列を使用して、区切りの文字列の内側になります。

'/something/' 

区切りPHPではなく'文字のペアで、/文字のペアがあるを参照しています。したがって、'something'と書くと、PHPは意図した区切り文字としてsをとり、区切り文字として英数字を使用できないと不平を言うでしょう。あなたはケース-insensitve試合をしたいことを示すために、(例えば)iを渡したい場合は

だから、あなたは正規表現区切り文字の文字列内が、外にそれを渡します。

'/something/i' 

は、あなたがしたい場合そのようなあなたがURLに一致していると、すべてのスラッシュをエスケープする必要がありますする必要はありませんかのように、次のことができ、あなたの区切り文字として/以外のものを使用する:

'~something~' 
+1

これは十分な時間upvoteできません! – Gruber

+0

@グルーバー:ありがとう! )あなたはいつもあなたの友人のリンクをそれにアップしてアップヴォートすることができます;) – iconoclast

+0

説明していない説明を説明してください.. +1ありがとうございました! –

5

をパターンには区切り文字を持っている必要があります。デリミタは、スラッシュ(/)または英数字以外の文字(#、$、*、...)にすることができます。例

あなたが変数として `)(`するpreg_matchにすべての引数を渡す場合、他の人に役立つかもしれないノート、あなたは偶然に巻き込ま変数の順序を取得しないことを確認してくださいとして
$pattern = "/My name is '(.*)' and im fine/"; 
$pattern = "#My name is '(.*)' and im fine#"; 
$pattern = "@My name is '(.*)' and im [email protected]"; 
関連する問題