1

両方ともファイルパスである2つの文字列変数があります。動作したコードは非推奨のeregを使用していたので、preg_matchを使用して書き直そうとしています。

動作した古いコード:

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

動作していないように見えるpreg_matchの使用:

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

それは与えます

preg_match():不明な修飾子'V'エラー。

また、私が取得しようとしている主なものは$ matches [1]です。これは、最初にキャプチャされた括弧で囲まれたサブパターンに一致するテキストであるため、実際には使用できないと思いますsubstr()

4

2 に答える 2

1

変数に特殊文字が含まれている$path場合は、それらをエスケープする必要があります。PCREを使用していることを考慮して、それらをエスケープする必要があります。POSIX-regexではありません。


これは、preg_quote関数;を使用して実行できます。つまり、コードは次のようになります。

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

特に、PCREは正規表現の周りに区切り文字を使用していることに注意してください。ここでは、/;を使用しました。preg_quoteこの関数はデフォルトでは文字をエスケープしないため、この区切り文字をに渡す必要があります/


使用していたquotemeta関数は、PCREで使用されているすべての文字を引用しているわけではありません。

一部のコードをPOSIX-regexからPCREに移植しているので、マニュアルのPCREパターンのセクションを確認する必要があります。PCREは非常に強力ですが、その機能にはいくつかのトリックがあります...

于 2010-03-04T20:46:26.743 に答える
0

これは正規表現なしで解決できます。

$pos = strpos($path2, $path);
if ($pos !== false) {
    $match = substr($path2, $pos+strlen($path));
}
于 2010-03-04T20:51:09.887 に答える