Подтвердить что ты не робот

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

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

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

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

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

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

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

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

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

РЕСУРСЫ:

4b9b3361

Ответ 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