preg_match две переменные с метасимволами - PullRequest
1 голос
/ 04 марта 2010

У меня есть две строковые переменные, которые являются путями к файлам. Работающий код использовал ereg, который устарел, поэтому я пытаюсь переписать его с помощью preg_match:

Старый код, который работал:

$path1 = quotemeta($path);
ereg("$path1(.*)$", $path2, $matches);

Использование preg_match, который не работает:

$path1 = quotemeta($path);
preg_match("/$path1(.*)$/", $path2, $matches);

Даёт

preg_match (): ошибка неизвестного модификатора 'V'.

Кроме того, главное, что я пытаюсь получить, это $ match [1], то есть текст, который соответствует первому захваченному заключенному в скобки подшаблону, поэтому я думаю, что на самом деле не могу использовать substr().

Ответы [ 2 ]

1 голос
/ 04 марта 2010

Если в вашей переменной $path есть какие-то специальные символы, их следует экранировать - и их следует экранировать, если вы используете PCRE ; а не POSIX-регулярное выражение .


Это можно сделать с помощью функции preg_quote; Это означает, что ваш код будет выглядеть так:

$path1 = preg_quote($path, '/');
preg_match("/$path1(.*)$/", $path2, $matches);

В частности, обратите внимание, что PCRE использует разделитель вокруг регулярного выражения - здесь вы использовали /; этот разделитель должен быть передан в preg_quote, так как эта функция по умолчанию не экранирует символ /.


Используемая вами функция quotemeta не заключает в кавычки все символы, используемые PCRE.

Поскольку вы переносите некоторый код из POSIX-regex в PCRE, вы должны взглянуть на раздел PCRE Patterns руководства : PCRE очень мощные, но эта мощь приходит с парой хитростей ...

0 голосов
/ 04 марта 2010

Вы можете решить это без регулярных выражений:

$pos = strpos($path2, $path);
if ($pos !== false) {
    $match = substr($path2, $pos+strlen($path));
}
...