web-dev-qa-db-ja.com

区切り文字は英数字またはバックスラッシュと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];

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

警告:preg_match()[function.preg-match]:区切り文字は英数字またはバックスラッシュであってはなりません

66
user547363

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

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

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

/something/

PHPは文字列を使用し、文字列内でanother区切り文字を探します:

'/something/'

PHPが参照している区切り文字は、/文字のペアではなく、'文字のペアです。したがって、'something'と記述すると、PHPはsを区切り文字として使用し、区切り文字として英数字を使用できないと文句を言います。

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

'/something/i'

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

'~something~'
57
iconoclast

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

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

下の同じ例では、大文字と小文字を区別せずに一致するi修飾子を使用しています。

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

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

また、区切り文字としてスラッシュ文字(/)を使用する場合、正規表現で/を使用する場合は、エスケープする必要があります。

20
Ben Swinburne

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

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

これで試してください

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

T-Regxライブラリ を使用することもできます。これは 自動区切り文字 を持っています:

$string1 = "My name is 'Kate' and im fine"; 

$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();

                 // ↑ No delimiters needed 
0
Danon