Ответ 1
Вам нужен разделитель для вашего шаблона. Он должен быть добавлен в начале и конце шаблона следующим образом:
$pattern = "/My name is '(.*)' and im fine/"; // With / as a delimeter
У меня есть этот код:
$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
Решение (в других ответах не упоминается "mdash", по крайней мере, во время моего первоначального написания) заключается в том, что, когда 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 [email protected]";
Попробуйте с этим
$pattern = "/My name is '\(.*\)' and im fine/";
Вы также можете использовать библиотеку T-Regx, которая имеет автоматические разделители для вас:
$string1 = "My name is 'Kate' and im fine";
$matches = pattern("My name is '(.*)' and im fine")->match($string1)->all();
// ↑ No delimiters needed