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

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

TEST 01: (3 backslashes)

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

// ----- RETURNS A MATCH -----

TEST 02: (4 backslashes)

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

// ----- ALSO RETURNS A MATCH -----

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

RESOURCES:

http://www.developwebsites.net/match-backslash-preg_match-php/ Can't escape the backslash with regex?

Ответы на вопрос(5)

Решение Вопроса

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

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

/[a]/
/[aa]/

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

 Mahmoud Tahan15 июн. 2012 г., 05:22
Таким образом, в обоих случаях механизм регулярных выражений рассматривает это как одиночную обратную косую черту?
 15 июн. 2012 г., 05:23
\[\] будет побег из закрывающей скобки.[\\] будет обратная косая черта в классе символов. один класс char довольно бессмысленен, он ничем не отличается от простого голого `\\`.
// 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 

None of the above results are affected by enclosing the strings in double instead of single quotes.

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

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

Escape-последовательности.

 19 дек. 2017 г., 11:42
Должен быть отмечен как ответ @ Махмуд Тахан
 29 нояб. 2013 г., 15:59
Когда я пытаюсь [\], я всегда получаю сообщение: preg_match (): Компиляция не удалась: отсутствует завершение] для класса символов со смещением 3

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

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

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

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

Если я что-то не так, пожалуйста, поправьте меня.

 20 янв. 2014 г., 18:03
-1: and this true one escapes the 3rd one Нету. Выполняется только один проход. Третья обратная косая черта "убегает"] (что просто приводит к] сам по себе).
 27 янв. 2014 г., 18:19
\r является escape-последовательностью;\] не является.
 27 янв. 2014 г., 16:07
@ Легкость: тогда почему & quot; / (\\\ r) \ 1 + / & apos; будет совпадать с повторением "\"; и 'r'; (Я имею в виду 2 настоящих персонажа)? Вы можете объяснить?

\x5c Как это :)

echo preg_replace( '/\x5c\w+\.php$/i', '<b>${0}</b>', __FILE__ );
 02 апр. 2018 г., 14:55
Избегатьback slash только заменить еще тремя символами и снова косой чертой. Уф!
 18 июл. 2018 г., 01:50
Спасатель, спасибо за это
 04 июн. 2017 г., 04:41
Я просто хочу сказать огромное спасибо за это. Избегая побег персонажей, как\n это уже боль, но сделать это в регулярном выражении с оглядкой назад - это непростая задача.

Ваш ответ на вопрос