1

我有一个我想要的 PHP 函数,这是我的 JavaScript 函数:

<script type="text/javascript">
                    str = '242357de5b105346ea2059795682443';
                    str_overral = str;
                    str_overral = str_overral.replace(/[^a-z0-9]/gi, '').toLowerCase();
                    str_res='';
                    for (i=0; i<str_overral.length; i++) {
                        l=str_overral.substr(i,1);
                        d=l.charCodeAt(0);
                        if ( Math.floor(d/2) == d/2 ) {
                            str_res+=l;
                        } else {
                            str_res=l+str_res;
                        }
                    }
                    document.write('<in');
                    document.write('put type="hidden" name="myInput" value="'+str_res+'" />');
                </script>

以上 JavaScript 函数为 myInput 生成此字符串:359795ae3515e753242db0462068244

这是我用 PHP 试过的:

    $str = '242357de5b105346ea2059795682443';
    $str_overral = preg_replace('/[^a-z0-9]/i', '',$str);
    $str_overral = strtolower($str_overral);
    $str_res=''; 
    for ($i=0; $i<strlen($str_overral); $i++) {
        $l= substr($str_overral,$i,1);
        // PHP does not have charCodeAt() function so i used uniord()
        $d = uniord($l);
        if((floor($d)/2) == ($d/2))
            $str_res.=$l;
        else
            $str_res.= $l.$str_res;
    }
    echo $str_res;

function uniord($c) {
        $h = ord($c{0});
        if ($h <= 0x7F) {
            return $h;
        } else if ($h < 0xC2) {
            return false;
        } else if ($h <= 0xDF) {
            return ($h & 0x1F) << 6 | (ord($c{1}) & 0x3F);
        } else if ($h <= 0xEF) {
            return ($h & 0x0F) << 12 | (ord($c{1}) & 0x3F) << 6
                                     | (ord($c{2}) & 0x3F);
        } else if ($h <= 0xF4) {
            return ($h & 0x0F) << 18 | (ord($c{1}) & 0x3F) << 12
                                     | (ord($c{2}) & 0x3F) << 6
                                     | (ord($c{3}) & 0x3F);
        } else {
            return false;
        }
    }   

和上面的 PHP 代码生成这个字符串:242357de5b105346ea2059795682443 所以基本上 PHP 只是按原样返回 $string。

由于 PHP 没有 charCodeAt() 函数,我在这里找到了一个解决方案UTF-8 Safe Equivelant of ord 或 charCodeAt() in PHP,但这对我不起作用,我什至尝试了 'hakre' 在同一个线程中发布的解决方案。

感谢您提供任何帮助。

更新解决方案:

这是修复:

if($d%2 == 0)
    $str_res.=$l;
else
    $str_res = $l.$str_res;
4

1 回答 1

2
if((floor($d)/2) == ($d/2))

你有一个)错误的地方。它应该在第一个之后/2,而不是在它之前。

它可以提高效率if($d%2 == 0)

于 2012-06-18T15:52:52.433 回答