什么是这个perl正则表达式的PHP等价物

时间:2012-10-31 18:23:46

标签: php regex perl translation

如何使用PHP编写这个perl代码?

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

编辑007应该是077

3 个答案:

答案 0 :(得分:4)

php有strtr函数,它使用数组键=>值对,其中字符串中键的实例被替换为value。除此之外,就像@Rocket所说,你可以使用preg_replace_callback来获取你的替换值。匹配的字符被传递给一个函数,并被函数返回的任何东西替换。

答案 1 :(得分:3)

您可以使用preg_replace_callback Perl

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

PERL Live Demo

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 Live Demo

两个输出

000102030405060708090a0b0c0d0e0f101112131415161716191a1b1c1d1e1f202122232425262728292a2b2c2d2e2f30313233313233343536373839303435

答案 2 :(得分: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///不应该在那里。)