Что значит это регулярное выражение?

Рейтинг: 0Ответов: 1Опубликовано: 14.12.2014
$INSTALLED = '0';
$val = '$INSTALLED';
$oldval = "$INSTALLED"
$regex = '~\\'.$val.'\s+=\s+\''.$oldval.'\';~is';

Две тильды для обозначения начала и конца регулярного выражения. Дальше непонятно, какую функциональность несет слеш, который после первой тильды. Потом непонятно, зачем нужно брать строку в одинарные кавычки после её конкатенации в выражение. Также неясно, зачем нужны две пары одинарных кавычек после конкатенации второй строки. И напоследок, что делает ~is'.

Ответы

▲ 2Принят

Дальше непонятно, какую функциональность несет слеш

Бэкслэш. Он экранирует следующий бэкслэш, поэтому первым символом совпадения должен быть один бэкслэш.

Потом непонятно, зачем нужно брать строку в одинарные кавычки после её конкатенации в выражение

Если вы про это

$oldval = "$INSTALLED"

то а) действительно не нужно и б) остутствие точки с запятой после выражения с $oldval убьет весь скрипт. Что до

$val = '$INSTALLED';

до заключенная в одинарные кавычки строка такой и останется. Другими словами:

$val . '=' . $oldval === '$INSTALLED=0';

Также неясно, зачем нужны две пары одинарных кавычек после конкатенации второй строки.

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

\$INSTALLED = '0';

Проще говоря, это прям-таки PHP-парсер для одного очень узкозаданного присвоения (правда, непонятно, что там делает бэкслэш).

И напоследок, что делает ~is

Все, что идет после второго разделителя - это флаги регулярного выражения, i = ignorecase, регистронезависимый поиск, s = PCRE_DOTALL, заставляет метасимвол "точка" совпадать с любыми символами вообще (без использования модификатора точка не совпадет с переводом строки). Подробнее, как всегда, в доках - http://php.net/manual/ru/reference.pcre.pattern.modifiers.php