Правильный способ избежать обратной косой черты в регулярном выражении PHP?

Просто из любопытства, я пытаюсь выяснить, какой именно правильный способ избежать обратной косой черты для использования в шаблоне регулярных выражений PHP, например:

ИСПЫТАНИЕ 01: (3 обратной косой черты)

$pattern = "/^[\\\]{1,}$/"; $string = '\\'; // ----- RETURNS A MATCH ----- 

ИСПЫТАНИЕ 02: (4 обратной косой черты)

 $pattern = "/^[\\\\]{1,}$/"; $string = '\\'; // ----- ALSO RETURNS A MATCH ----- 

Согласно приведенным ниже статьям 4, предположительно, это правильный путь, но меня смущает то, что оба теста вернули матч. Если оба правильные, то 4 предпочтительным способом?

РЕСУРСЫ:

  • http://www.developwebsites.net/match-backslash-preg_match-php/
  • Не удается избежать обратного слэша с помощью регулярного выражения?

Дело в том, что вы используете класс символов, [] , поэтому неважно, сколько буквальных обратных косых черт внедрено в него, оно будет рассматриваться как одна обратная косая черта.

например, следующие два регулярных выражения:

 /[a]/ /[aa]/ 

для всех целей и целей идентичны по отношению к двигателю регулярных выражений. Классы символов принимают список символов и «сворачивают» их вниз, чтобы соответствовать одному символу, по линиям «для текущего рассматриваемого символа, является ли он любым из символов, перечисленных внутри [] ?». Если вы перечислите две обратные косые черты в классе, тогда это будет «является ли черным черным цветом или это обратная косая черта?».

 // 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 

При использовании трех обратных косых черт для соответствия '\' шаблон ниже интерпретируется как совпадение с '\' за которым следует '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 вместо одиночных кавычек.

Выводы:
Независимо от того, внутри или вне класса символов в квадратных скобках, буквальная обратная косая черта может быть сопоставлена ​​с использованием только трех обратных косых черт '\\\' если следующий символ в шаблоне также не сбрасывается, и в этом случае буквальная обратная косая черта должна быть сопоставлена ​​с использованием четырех обратных косых черт.

Рекомендация:
Всегда используйте четыре обратных косая черта '\\\\' в шаблоне регулярных выражений, когда вы пытаетесь найти обратную косую черту.

Побег последовательностей .

Чтобы избежать такого неясного кода, вы можете использовать \ x5c. Вот так 🙂

 echo preg_replace( '/\x5c\w+\.php$/i', '<b>${0}</b>', __FILE__ ); 

Я учился много лет назад. Это потому, что 1-я обратная косая черта ускользает от второго, и они вместе образуют символ «истинный баклькслаш» в шаблоне, и этот истинный побег 3-го. Таким образом, это волшебство делает 3 обратных слэша работы.

Однако нормальное предложение состоит в том, чтобы использовать 4 обратной косой черты вместо двусмысленных 3 обратных косых черт.

Если я ошибаюсь во всем, пожалуйста, не стесняйтесь меня исправлять.

Вы также можете использовать следующие

 $regexp = <<<EOR schemaLocation\s*=\s*["'](.*?)["'] EOR; preg_match_all("/".$regexp."/", $xml, $matches); print_r($matches); 

ключевые слова: dochere, nowdoc