2013-06-23 4 views
1

Я нашел функцию в MediaWiki Source, которая преобразует строку с умляутами в формат HEX.PHP: преобразовать строку обратно в норму

Теперь я хочу преобразовать форматированную строку обратно в строку с помощью умляутов.

Функция:

$Umlaut = "löschen"; 

    $out = preg_replace_callback("/([\\xc0-\\xff][\\x80-\\xbf]*)/",'stripForSearchCallback', $Umlaut); 

    function stripForSearchCallback($matches) { 
     return 'u8' . bin2hex($matches[1]); 
    } 

    echo $out; 

Выход: "lu8c3b6schen"

Теперь я хочу, чтобы преобразовать "lu8c3b6schen" обратно в "löschen".

Как я могу это сделать, пожалуйста?

+0

Match для hexnum кортежей и использовать 'CHR (HexDec())' в качестве обратного вызова. – mario

+0

Действительно ли ваш выход? Я, хотя этот шестнадцатеричный формат должен быть парой '[a-z0-9]', но у вас есть неравномерный формат '8c3b6'. Может, я что-то упустил? Также обратите внимание, что регулярное выражение, скорее всего, испортит ваше предложение, например, если у вас есть номера в нем 'löschen 65' или последовательные шестнадцатеричные буквы: ** acce ** nt – HamZa

+0

Да, вы правы. Я не считаю его HEX. Mediawiki говорит следующее: «Бронируйте свернутую в очередь строку UTF-8, чтобы пройти через MySQL \t * Полнотекстовый поиск, не сбрасываемый смешными кодировками \t * настройки или что-то в этом роде." - Но я не могу найти какую-либо функцию, способную ее преобразовать. – Steven

ответ

2

Попробуйте что-то вроде этого:

$string = "lu8c3b6schen"; 

$out = preg_replace_callback("/u8([a-f0-9]{4})/",'unstrip', $string); 

function unstrip($matches) { 
    $decoded = hex2bin($matches[1]); 
    return $decoded ? $decoded : $matches[1]; 
} 

echo $out; 
+0

Спасибо, друг :) Работает замечательно. – Steven

+1

* sigh * Как я не видел 'u', +1 – HamZa