区切り文字は英数字または円記号およびpreg_matchであってはなりません


86

私はこのコードを持っています:

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

そして、imを実行すると、次のエラーが返されます。

警告:preg_match()[function.preg-match]:区切り文字は英数字または円記号であってはなりません


2
他の人に役立つかもしれないメモとして、すべての引数をpreg_match()変数として渡す場合は、関数呼び出しで変数の順序が誤って混同されないように注意してください。これもほぼ確実に同じ結果になります。エラーが表示されます。
bluebinary 2015

1
あなたの正規表現文字列に区切り文字を必要とする
のKiJéy

2
使用$pattern = "/My name is '(.*)' and im fine/";
GK。

回答:


133

パターンには区切り文字が必要です。次のように、パターンの最初と最後に追加する必要があります。

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

正規表現を囲むために二重引用符を使用することに注意してください。そうしないと、一部の\ +文字の組み合わせ(\l改行など)がそれらの文字に変換され、予期しない式が生成される可能性があります。一重引用符を使用します。php文字列の説明を参照してください。
パタンジャリ

この例では、文字列に一重引用符が含まれているため、二重引用符を使用して文字列を囲むのが簡単です(\'一重引用符で囲まれた場合に必要となるエスケープを回避します)。
ポール

例を見ている人は、他の状況に拡張した場合に発生する可能性のある予期しない結果に気付かずに、例を自分で「クッキーカット」するものと見なす可能性があるため、私は一般的なコメントをしていました。残念ながら、コメントをさらに具体的に変更することはできません。
パタンジャリ

68

解決策(他の回答では言及されていませんが、少なくともこれを最初に書いた時点では)は、PHPが区切り文字を参照する場合、コードに表示される区切り文字(引用符)ではなく、次の区切り文字を参照することです。文字列内の文字。(実際、これがドキュメントのどこにも記載されているのを見たことがありません。例で見る必要があります。)したがって、他の多くの言語で慣れているような正規表現構文を使用する代わりに、次のようにします。

/something/

PHPは文字列を使用し、文字列内で別の区切り文字を探します。

'/something/'

PHPが参照している区切り文字は、/文字のペアではなく、'文字のペアです。したがって、を書くと'something'、PHPはs意図された区切り文字と見なし、英数字を区切り文字として使用することは許可されていないと文句を言います。

したがって、(たとえば)を渡してi、大文字と小文字を区別しない一致が必要であることを示す場合は、文字列内で正規表現区切り文字の外に渡します。

'/something/i'

/区切り文字として以外のものを使用する場合は、URLを照合していて、すべてのスラッシュをエスケープする必要がない場合など、次のことができます。

'~something~'

1
@Gruber:ありがとう!あなたはいつでもそれへのすべての友達のリンクを送って、彼らにそれを賛成させることができます;)
iconoclast 2015

1
ドキュメントで説明されていないことを説明する.. + 1ありがとうございます!
Ju Oliveira

最高の賛成の答えはこれと同じですが、これが正しい答えである理由を理解できたことに感謝しています。+1ありがとう!
折衷的な

21

式の区切り文字を指定する必要があります。区切り文字は、式の最初と最後で使用される特殊文字で、どの部分が式であるかを示します。これにより、修飾子とインタープリターを使用して、どちらが式でどれが修飾子であるかを知ることができます。エラーメッセージに示されているように、バックスラッシュはエスケープ文字であるため、区切り文字をバックスラッシュにすることはできません。

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

同じ例の下にありますが、i大文字と小文字を区別せずに一致する修飾子があります。

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

ご覧のとおり、iはスラッシュの外側にあるため、修飾子として解釈されます。

また、区切り文字としてスラッシュ文字(/)を使用する場合は、正規表現での/の使用を回避する必要があることにも注意してください(存在する場合)。


7

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

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


0

元のコード例とは関係がないかもしれませんが、「区切り文字は英数字または円記号であってはなりません」というエラーが表示され、ここでGoogleで検索しました。理由:preg_matchのパラメーターの順序を混在させました。パターンが2番目のパラメーターであり、一致する文字列が最初でした。注意してください :)


-2

これで試してみてください

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

なぜ括弧をエスケープするのですか?
のKiJéy

1
@kiJey。OPの状況では、名前を抽出したかったので、一致には括弧が必要であり、したがってエスケープしてはなりません。これが私が反対票を投じている理由です。
パタンジャリ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.