2

PHPを使用してこのperlコードを作成するにはどうすればよいですか?

$var =~ tr/[A-Za-z,.]/[\000-\077]/;

編集007は077である必要があります

4

3 に答える 3

4

phpには、文字列内のキーのインスタンスが値に置き換えられる配列key=>valueペアを使用するstrtr関数があります。それ以外は、@ Rocketが言ったように、preg_replace_callbackを使用して置換値を取得できます。一致した文字は関数に渡され、関数が返すものに置き換えられます。

于 2012-10-31T18:36:47.157 に答える
3

preg_replace_callback Perlを使用できます

my $var = 'ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghijklmnopqrstuvwxyz1234567890,.';
$var =~ tr/[A-Za-z,.]/[\000-\077]/;
print unpack("H*", $var), "\n";

PERLライブデモ

PHP

$string = 'ABCDEFGHIJKLMNOPQRSTUVWXWZabcdefghijklmnopqrstuvwxyz1234567890,.';
$replace = preg_replace_callback("/[A-Za-z,.]/", function ($m) {
    $n = 0;
    if (ctype_punct($m[0])) {
        $m[0] == "," and $n = - 8;
        $m[0] == "." and $n = - 7;
    } else {
        $n = ctype_upper($m[0]) ? 65 : 71;
    }
    return chr(ord($m[0]) - $n);
}, $string);
print(bin2hex($replace));

PHPライブデモ

両方の出力

000102030405060708090a0b0c0d0e0f101112131415161716191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233313233343536373839303435
于 2012-10-31T19:19:56.763 に答える
3

誰かがPHPには同等のものがないと言いましたtr///(私は今それがとしてあることを知っていますがstrtr)。もしそうなら、

$var =~ tr/A-Za-z,./\000-\077/;

次のように置換として書くことができます:

my %encode_map;
my $i = 0;
$encode_map{$_} = chr($i++) for 'A'..'Z', 'a'..'z', ',', '.';

$var =~ s/([A-Za-z,.])/$encode_map{$1}/g;

これはPHPに翻訳する方が簡単なはずですが、残念ながら私はPHPを知りません。

(私は、[]にあるtr///はずがないことを前提としています。)

于 2012-10-31T21:10:07.753 に答える