13

PHPのpreg_match関数で使用したときに、次の正規表現が失敗する理由を誰かが明らかにできるかどうか疑問に思います。-

<?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を使用してバックスラッシュをフォワードスラッシュに交換することで、問題を回避しました。これは私の状況では機能しますが、この正規表現が失敗する理由を知っておくと便利です。

4

4 に答える 4

20

リテラルのバックスラッシュをエンコードするには、2回エスケープする必要があります。1回は文字列用、もう1回は正規表現エンジン用です。

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

PHPでは(一重引用符で囲まれた文字列を使用する場合)、これは実際の円記号にのみ関係します。他の正規表現エスケープは、1つの円記号で問題ありません。

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

これについては、マニュアルで説明されています(ページ上部の「注:」というラベルの付いたボックスを参照してください)。

于 2012-04-30T13:55:53.293 に答える
1

|\\\tmp\\\([A-Za-z0-9]+)|式を使用する必要があります

しかし、文字列の具体的な形式のため、ファイル名を取得するためのより良い方法があります。例えば:

substr($str, 5, -4);

メモリ使用量について考える

于 2012-04-30T14:01:36.317 に答える
0

奇妙なことに、あなたが言及したのと同じオンライン正規表現テスターを使用してテストしたところ、エラーなしでコンパイルされました:

<?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);
?>
于 2012-04-30T13:56:04.773 に答える
0

次の正規表現を使用します。

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
)
于 2012-04-30T14:24:47.493 に答える