Intereting Posts
PHP-код для вставки значения флажка в spesific-столбец в mysql с формой выбора Как я могу отправить данные с веб-страницы на последовательный порт компьютера посетителя? Поиск многомерного массива для значения PHP Являются ли подготовленные PDO заявления достаточными для предотвращения SQL-инъекций? Обновление версии Sagepay 2.22 до 3.00 – обновление PHP до шифрования AES PHP: перемещение элемента ассоциативного массива в начало массива Подменю типа MIME Высокие значения круговых диаграмм HighCharts X-axies не отображаются при попытке получить данные из базы данных MySQL с помощью PHP Формат страницы продукта Woocommerce «Требуется длина», при отправке данных с помощью cURL В чем преимущество использования Heredoc в PHP? escape-строки для SQLite3 в PHP5 Различные результаты в AES256 шифровании в Swift (iOS) и PHP Защита паролем веб-каталогов и файлов Многочисленные команды PHP SSH

"Preg_match (): Ошибка компиляции: несогласованные скобки" в PHP для допустимого шаблона

Удивление, если кто-нибудь там может пролить свет на то, почему следующее регулярное выражение не работает при использовании в функции preg_match PHP:

<?php $str = '\tmp\phpDC1C.tmp'; preg_match('|\\tmp\\([A-Za-z0-9]+)|', $str, $matches); print_r($matches); ?> 

В результате появляется сообщение об ошибке «preg_match ():« Ошибка компиляции: несогласованные скобки », несмотря на то, что шаблон выглядит действительным. Я тестировал его с помощью онлайн- анализатора регулярных выражений PHP и инструмента Linux Kiki. Кажется, что PHP избегает открывающей скобки, а не обратной косой черты.

Я столкнулся с проблемой, используя str_replace для замены обратных косых черт для форвардных. Это работает для моей ситуации, но было бы неплохо узнать, почему это регулярное выражение терпит неудачу.

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

 preg_match('|\\\\tmp\\\\([A-Za-z0-9]+)|', $str, $matches); 

В PHP (при использовании строк с одной кавычкой) это имеет значение только для фактических обратных косых черт; другие escape-варианты регулярных выражений в порядке с одной обратной косой чертой:

 preg_match('/\bhello\b/', $subject) 

Это описано в руководстве (см. Поле с надписью «Примечание:» в верхней части страницы).

вы должны использовать |\\\tmp\\\([A-Za-z0-9]+)| выражение

но есть лучший способ получить имя файла из-за конкретной формы строки. например:

 substr($str, 5, -4); 

думать об использовании памяти

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

 <?php $ptn = "/<;?php $str = '\tmp\phpDC1C.tmp'; preg_match('|\\tmp\\([A-Za-z0-9]+)|', $str, $matches); print_r($matches); ?>;/"; $str = ""; preg_match($ptn, $str, $matches); print_r($matches); ?> 

Используйте следующее регулярное выражение:

 php >$str = '\tmp\phpDC1C.tmp'; php >preg_match('/[\\\\]tmp[\\\\]([A-Za-z0-9]+)/', $str, $matches); php >print_r($matches); Array ( [0] => \tmp\phpDC1C [1] => phpDC1C )