Разделитель не должен быть буквенно-цифровым или обратным слэшем, а 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 run, он возвращает эту ошибку:

Предупреждение: preg_match () [function.preg-match]: разделитель не должен быть буквенно-цифровым или обратным слэшем

Вам нужен разделитель для вашего шаблона. Он должен быть добавлен в начале и в конце шаблона так:

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

Решение (в других ответах не упоминается – по крайней мере, во время моего первоначального написания) заключается в том, что когда PHP ссылается на разделители, это не относится к разделителям, которые вы видите в своем коде (которые являются кавычками), а в следующем символов внутри строки. (На самом деле, я никогда не видел этого нигде в любой документации: вы должны увидеть его в примерах.) Поэтому вместо синтаксиса регулярных выражений, как то, к чему вы привыкли, со многих других языков:

 /something/ 

PHP использует строки, а затем просматривает строку для другого разделителя:

 '/something/' 

Разделитель PHP имеет в виду пару / символов, а не пару символов. Поэтому, если вы пишете 'something' , PHP будет считать s в качестве предполагаемого разделителя и жалуется, что вам не разрешено использовать буквенно-цифровые символы в качестве разделителя.

Поэтому, если вы хотите передать (например) i чтобы показать, что вы хотите совпадение с регистрацией, вы передаете его внутри строки, но вне разделителей регулярных выражений:

 '/something/i' 

Если вы хотите использовать что-то отличное от / качестве разделителя, вы можете, например, если вы сопоставляете URL-адрес и не хотите, чтобы он удалялся от всех косых черт:

 '~something~' 

Вы должны указать разделитель для своего выражения. Разделитель – это специальный символ, используемый в начале и в конце выражения для обозначения того, какая часть является выражением. Это позволяет использовать модификаторы и интерпретатор, чтобы знать, что является выражением и которые являются модификаторами. Как указано в сообщении об ошибке, разделитель не может быть обратным слэшем, потому что обратная косая черта является символом escape.

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

и ниже того же примера, но с модификатором i , чтобы он не был чувствительным к регистру.

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

Как вы можете видеть, i находится вне косых черт и поэтому интерпретируется как модификатор.

Также имейте в виду, что если вы используете символ косой черты (/) в качестве разделителя, вы должны избегать дальнейшего использования / в регулярном выражении, если оно присутствует.

У шаблона должны быть разделители. Разделители могут быть косой чертой (/) или любыми не алфавитно-цифровыми символами (#, $, *, …). Примеры

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

Попробуйте с этим

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