2012-10-31 34 views
2

如何使用PHP編寫這個Perl代碼?這個Perl正則表達式的PHP等效什麼

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

編輯007應該已經077

+2

PHP沒有花哨的翻譯如Perl一樣。您可能要使用['preg_replace_callback'](http://php.net/preg_replace_callback)。 –

+2

你爲什麼不發佈你的嘗試,以便人們可以幫助你改進呢? – Ali

+0

這個Perl表達式的Perl相當於什麼?您的搜索列表有56個字符,而您的替換列表有66個。實際上,@ mob,54和64實際上是 – mob

回答

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 
+0

固定參閱http://codepad.viper-7.com/GXE5QU – Baba

+0

@ikegami感謝您的更正。 – Baba

3

PHP具有使用陣列密鑰strtr函數=>值對,其中在字符串密鑰的實例被替換值。除此之外,就像@火箭所說的,你可以使用preg_replace_callback來獲得你的替換值。匹配的字符被傳遞給一個函數,並被函數返回的內容替換。

2

有人說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///[]不應該在那裏。)

+0

+神奇故障... – Baba

相關問題