2012-07-24 49 views
0

我有一個字符串被解碼爲base36,即0-9a-z, 任何其他字符被解碼如下:一個Unicode字符代碼,轉換爲base36和先行以大寫字母「A」開頭,後跟字母「B」。 如果出現多個unicode字符,則只顯示最後一個字符,如果後跟'B'。PHP:需要解碼一個字符串與UTF字符嵌入

例子:

[email protected]嬰兒服飾.com 

轉換爲:

zergmeA1sBwtfdA19Ahv8Ag1rAkctAub4A1aBcom 

很方便,這樣的數據轉換,但我現在抨擊我的頭怎麼寫呢解碼算法回。

我已經提供了一個將字符轉換爲Unicode字符的函數,它被稱爲'unichr($ code)';

...但我想不出找到這些字符的好方法。

我是想先用正則表達式,像:

preg_replace('/A.*?B?(?=[AB])/',"$1",$mail); 

但它沒有工作,我想要的方式......我還沒有意識到如何又名投我的自定義功能皈依'unichr()'的比賽。

然後我也在考慮用strpos()手動查找字符,但它也變得混亂。

你能建議一些模式嗎?或者我應該詳細說明正則表達式還是嘗試使用某個循環?我有點空白...謝謝:)

LOLMAO

就是它,看起來像我想通了,感謝你的貢獻:

'/A(.*?)((?=A)|B)/' 
+0

1.我不知道這是隻可轉換使用正則表達式,你需要一個解析器來掃描字符串,用'分裂[AB]'並分別處理每個編碼字符。 2.如果你想編碼新的數據,考慮punycode算法 - 它的兩個方向至少是衆所周知的。 – Piskvor 2012-07-24 13:22:53

+0

爲什麼不使用UTF-8編碼?它返回字符串:zergme%40wtfd-%E5%A9%B4%E5%84%BF%E6%9C%8D%E9%A5%B0.com。這可以用Utf8解碼器解碼。 http://php.net/manual/en/function.utf8-encode.php – Pilatus 2012-07-24 13:26:16

+0

好吧,我希望你意識到每個字形需要6個字符,即:%E5%A9只是一個字符。但對我而言,如果轉換爲base62,則會減少兩倍。 – Anonymous 2012-07-24 13:29:30

回答

0

您是否使用preg_replace_callback()代替了?它使用函數而不是字符串作爲替換值,並將匹配傳遞給函數,並將函數的返回值用作替換字符串。

寬鬆的例子,你必須圍繞一個有點玩

<?php 
$str = 'zergmeA1sBwtfdA19Ahv8Ag1rAkctAub4A1aBcom'; 

function convert_to_unicode_cb($match) 
{ 
    // $match1 would be 1s, 19, hv8, etc 
    return unichr($match[1]); 
} 

preg_replace_callback('/A(.*?)(?=A|B)/', 'convert_to_unicode_cb', $str); 
+0

是的,這看起來可行,你增強了我對preg_callback func的知識。雖然它仍然不起作用,因爲你捕獲的第二組也可以作爲分隔符。添加非捕獲組幾乎可以解決它:例如'/A(.*?)(?=A|B)/'但它仍然不會讓我擺脫那個B信... – Anonymous 2012-07-24 14:05:55

+0

好吧,我看到問題與我原來的正則表達式,但如果你使用一個非捕獲的第二組對我來說工作得很好。我的回調針對測試字符串執行7次,'$ match [1]'等於'1s','19','hv8','g1r','kct','ub4'和'1a' – 2012-07-24 14:21:10

+0

是的,但是你是否意識到'B'沒有被捕獲,所以結果仍然包含字母'B':)我編輯了這個問題以適應我的工作:它會捕獲'B'但不捕獲第二個'A'... – Anonymous 2012-07-24 14:24:23

0

如何aobut Base64編碼(gzcompress )和解碼(gzuncompress)。在文本字段

<?php 
    if(isset($_POST['text'])){ 
     echo("<b>input:</b> ".$_POST['text']."<br/>"); 
     $c = gzcompress($_POST['text']); 
     echo("<b>base64 encoding:</b> .".$c."<br/>"); 
     echo("<b>base64 decoding:</b> " .gzuncompress($c)); 
     exit; 
    } 
?> 

<html> 

    <body> 
     <form method=post action=testBase64.php> 
      <input type=text name=text /> 
      <input type=submit /> 
     </form> 
    </body> 
</html> 

運行,然後輸入 「zergme @ wtfd-嬰兒服飾.COM」:

保存名爲 「testBase64.php」 以下。

輸出:

輸入: zergme @ wtfd-嬰兒服飾.COM

base64編碼:.xœ«J-極目(/IKÑUS62645³Òæ--ÚÌØÂH[YXE% ççG°@

base64解碼: zergme @ wtfd-嬰兒服飾.com

希望這會有所幫助。

+0

但這並沒有回答這個問題。我考慮了很多方法,並且我轉換數據的方式很方便。 – Anonymous 2012-07-24 13:33:45

相關問題