Просто из любопытства, я пытаюсь выяснить, какой именно правильный способ избежать обратной косой черты для использования в шаблоне регулярных выражений PHP, например:
ИСПЫТАНИЕ 01: (3 обратной косой черты)
$pattern = "/^[\\\]{1,}$/"; $string = '\\'; // ----- RETURNS A MATCH -----
ИСПЫТАНИЕ 02: (4 обратной косой черты)
$pattern = "/^[\\\\]{1,}$/"; $string = '\\'; // ----- ALSO RETURNS A MATCH -----
Согласно приведенным ниже статьям 4, предположительно, это правильный путь, но меня смущает то, что оба теста вернули матч. Если оба правильные, то 4 предпочтительным способом?
РЕСУРСЫ:
Дело в том, что вы используете класс символов, []
, поэтому неважно, сколько буквальных обратных косых черт внедрено в него, оно будет рассматриваться как одна обратная косая черта.
например, следующие два регулярных выражения:
/[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