У меня есть этот код:
$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/";