Что означает последовательность \o в PCRE?

268
18 января 2018, 21:50
<?php
    echo  preg_replace ('/\\o/',  'O',  'What is Compatible?');
?>

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

Warning: preg_replace(): Compilation failed: missing opening 
brace after \o at offset 1 

Если мы заменим 'o' ,например, на 'm'(т.е. '/\\m/'), то в слове 'Compatible' строчная 'm' заменится на прописную 'O', что ожидаемо. Если кто-либо сможет объяснить, в качестве чего воспринимается последовательность '\o'), буду очень благодарен.

Версия PHP 7.1.6 (xampp v3.2.2). Заранее спасибо! */

Answer 1

Судя по https://pcre.org/pcre.txt, \o используется для поиска совпадений символов по их восьмеричному коду:

\0dd      character with octal code 0dd
\ddd      character with octal code ddd, or back reference
\o{ddd..} character with octal code ddd..

Проверяем:

// 157 - восьмеричный код "о" http://www.asciitable.com/
var_dump(preg_match_all('/\o{157}/', 'What is Compatible?', $matches));
var_dump($matches); 

Похоже на правду:

etki@kepler:~ > php /tmp/pcre.php                                                                                                                                                                                                                                              
int(1)                                                                                                                                                                                                                                                                         
array(1) {                                                                                                                                                                                                                                                                     
  [0]=>                                                                                                                                                                                                                                                                        
  array(1) {                                                                                                                                                                                                                                                                   
    [0]=>                                                                                                                                                                                                                                                                      
    string(1) "o"                                                                                                                                                                                                                                                              
  }                                                                                                                                                                                                                                                                            
}    
Answer 2

Это зарезервированная буква и может использоваться как настройка в конце регулярного выражения. Например:

  i case insensitive 
  m make dot match newlines 
  x ignore whitespace in regex
  o perform #{...} substitutions only once

Еще один вариант это работать как с восьмеричной системой счисления

READ ALSO
Laravel не видит сервис-провайдер

Laravel не видит сервис-провайдер

Создаю пакет для LaravelЕсть сервис-провайдер CartServiceProvider, который лежит в пространстве имен Alexxosipov\Cart

297
PHP MYSQL Структура пользовательского чата

PHP MYSQL Структура пользовательского чата

Здравствуйте, планирую сделать на сайте пользовательский чатТо есть не общий чат, а между конкретными пользователями, два человека

291
Библиотеки php для yii2 на os x

Библиотеки php для yii2 на os x

Добрый день, инсталлирую на локальный сервер(php-71/apache-2

280
Как Laravel хранит маршруты?

Как Laravel хранит маршруты?

В гайде написано о файлах маршрутовИнтересно как они выглядят

277