2010-03-04 4 views
1

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

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

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

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

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

Это дает

preg_match(): Unknown модификатор ошибка 'V'.

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

ответ

1

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


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

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

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


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

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

+0

Ничего себе, это полностью исправлено! Спасибо, что сделали мой день! – highlightall

+0

Добро пожаловать :-) Удачи! –

0

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

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

Я думаю, что $ match дает мне сопоставленную строку вместо текста, который соответствует скобке в скобках. Но это, безусловно, рабочий код. Благодарю. – highlightall

+0

@highlightall: Положите '$ path' перед ним, и вы получите полное совпадение. – Gumbo