Удивление, если кто-нибудь там может пролить свет на то, почему следующее регулярное выражение не работает при использовании в функции 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 )