9

私はpreg_replace特殊文字をエスケープするために使用しています:

$tmpStr=preg_replace("/\?/", "\?", $tmpStr);
$tmpStr=preg_replace("/\#/", "\#", $tmpStr);
$tmpStr=preg_replace("/\^/", "\^", $tmpStr);
$tmpStr=preg_replace("/\&/", "\&", $tmpStr);
$tmpStr=preg_replace("/\*/", "\*", $tmpStr);
$tmpStr=preg_replace("/\(/", "\(", $tmpStr);
$tmpStr=preg_replace("/\)/", "\)", $tmpStr);
$tmpStr=preg_replace("/\//", "\/", $tmpStr); 

$しかし、同じ関数を使用してエスケープすることはできません:

$tmpStr=preg_replace("/\$/", "\$", $tmpStr);

また、上記のステートメントを使用すると、すべてのスペースが置き換えられ、$エスケープ$されません。

ドル記号を正しくエスケープするにはどうすればよいですか?

4

10 に答える 10

13

代わりにpreg_quote()を使用することを強くお勧めします。

于 2009-04-20T10:42:02.827 に答える
5

あなたの問題はエスケープの問題のようです。PHP の単一引用符 ( ') は、二重引用符 ( ) とは異なる働きをします"。これは Perl とよく似ており、一重引用符で囲まれた文字列では変数補間が行われず、ドル記号 ( $) はメタ文字ではありません。

print "\$"; # prints $
print '\$'; # prints \$

また、Perl の文字クラスはコードを簡素化します。

$tmpStr = preg_replace('/([?#^&*()$\\/])/', '\\\\$1', $tmpStr);
于 2010-05-22T03:04:13.193 に答える
4

$ 記号はそれ自体でエスケープする必要があるため、

$tmpStr=preg_replace("/$$/", "\$", $tmpStr);

代わりに、 addslashesを検討することもお勧めします。

于 2009-04-20T10:43:32.683 に答える
2

はい、\\$PHP では$二重引用符で囲まれた文字列として認識されているようです。つまり、PHP\$に と言ってa を表示させる必要があります\\\$

試してみたところpreg_replace("/\\\$$k\\\$/", $v, $data)、実際に機能します(の出現$KEY$を VALUE.

于 2012-11-01T10:13:35.043 に答える
0

IIRC は $ を $ に置き換えます。だから、それは$$でなければなりません

あなたも試すことができます

$tmpStr=preg_replace('/\$/', '\$', $tmpStr);
于 2009-04-20T10:38:21.197 に答える
0

PHP が \$ を $ と見なすのは本当ではありませんか? 私はこれをテストしていませんが、次のようになる可能性があります。

php が最初で、"/\$/" を "/$/" に置き換えると、preg エンジンが魔法のように動作します。残念ながら、$ は正規表現演算子です (文字列の末尾に一致すると思いますか?)。テキスト内の $ 文字は見つかりませんが、

あなたがする必要があるのは、 $ 文字をダブルエスケープすることだと思います。

$tmpStr=preg_replace("/\$/", "\$", $tmpStr);

また..この場合、 str_replace() を使用しただけです

于 2009-04-20T10:47:35.980 に答える
-1
$pattern = preg_replace('/\$(.+)/', '\\\$$1', $pattern);
于 2016-03-17T07:49:07.583 に答える