Правильный способ избежать обратной косой черты [\] в регулярном выражении PHP?
Просто из любопытства, я пытаюсь выяснить, какой именно правильный способ избежать обратного слэша для использования в шаблоне регулярных выражений PHP, например:
ИСПЫТАНИЕ 01: (3 обратной косой черты)
$pattern = "/^[\\\]{1,}$/";
$string = '\\';
// ----- RETURNS A MATCH -----
ИСПЫТАНИЕ 02: (4 обратная косая черта)
$pattern = "/^[\\\\]{1,}$/";
$string = '\\';
// ----- ALSO RETURNS A MATCH -----
Согласно приведенным ниже статьям 4, предположительно, это правильный путь, но меня смущает то, что оба теста вернули совпадение. Если оба правильные, то 4 предпочтительный путь?
РЕСУРСЫ:
Ответы
Ответ 1
Дело в том, что вы используете класс символов, []
, поэтому неважно, сколько в нем встроенных обратных косых черт, оно будет рассматриваться как одна обратная косая черта.
например. следующие два регулярных выражения:
/[a]/
/[aa]/
для всех целей и целей идентичны по отношению к движку регулярных выражений. Классы символов принимают список символов и "сворачивают" их вниз, чтобы соответствовать одному символу, по строкам "для текущего рассматриваемого символа, является ли это любым из символов, перечисленных внутри []
?". Если вы перечислите две обратные косые черты в классе, то это будет "есть ли char черная абстракция или это обратная косая черта?".
Ответ 2
// PHP 5.4.1
// Either three or four \ can be used to match a '\'.
echo preg_match( '/\\\/', '\\' ); // 1
echo preg_match( '/\\\\/', '\\' ); // 1
// Match two backslashes `\\`.
echo preg_match( '/\\\\\\/', '\\\\' ); // Warning: No ending delimiter '/' found
echo preg_match( '/\\\\\\\/', '\\\\' ); // 1
echo preg_match( '/\\\\\\\\/', '\\\\' ); // 1
// Match one backslash using a character class.
echo preg_match( '/[\\]/', '\\' ); // 0
echo preg_match( '/[\\\]/', '\\' ); // 1
echo preg_match( '/[\\\\]/', '\\' ); // 1
При использовании трех обратных косых черт для соответствия '\'
шаблон ниже интерпретируется как совпадение a '\'
, за которым следует 's'
.
echo preg_match( '/\\\\s/', '\\ ' ); // 0
echo preg_match( '/\\\\s/', '\\s' ); // 1
При использовании четырех обратных косых черт для соответствия '\'
шаблон ниже интерпретируется как совпадение с '\'
, за которым следует пробельный символ.
echo preg_match( '/\\\\\s/', '\\ ' ); // 1
echo preg_match( '/\\\\\s/', '\\s' ); // 0
То же самое относится к классу символов.
echo preg_match( '/[\\\\s]/', ' ' ); // 0
echo preg_match( '/[\\\\\s]/', ' ' ); // 1
Ни один из приведенных выше результатов не затрагивает включение строк в double вместо одиночных кавычек.
Выводы:
Независимо от того, внутри или вне класса символов в квадратных скобках, буквальная обратная косая черта может быть сопоставлена с использованием только трех обратных косых черт '\\\'
, если только следующий символ в шаблоне также не сбрасывается, и в этом случае буквальная обратная косая черта должна быть сопоставлена с использованием четырех обратных косых черт.
Рекомендация:
Всегда используйте четыре обратной косой черты '\\\\'
в шаблоне регулярных выражений при поиске соответствия обратному косую черту.
Эвакуационные последовательности.
Ответ 3
Чтобы избежать такого нечеткого кода, вы можете использовать \x5c
Вот так:)
echo preg_replace( '/\x5c\w+\.php$/i', '<b>${0}</b>', __FILE__ );
Ответ 4
Я учился много лет назад. Это потому, что 1-я обратная косая черта ускользает от второго, и они вместе образуют символ "истинный баклькслаш" в шаблоне, и этот истинный побег 3-го. Таким образом, это волшебство делает 3 обратных слэша работы.
Однако нормальное предложение состоит в том, чтобы использовать 4 обратных слэша вместо двусмысленных 3 обратных косых черт.
Если я ошибаюсь ни о чем, пожалуйста, не стесняйтесь меня исправлять.
Ответ 5
Вы также можете использовать следующие
$regexp = <<<EOR
schemaLocation\s*=\s*["'](.*?)["']
EOR;
preg_match_all("/".$regexp."/", $xml, $matches);
print_r($matches);
ключевые слова: dochere, nowdoc