1

这是 lib.php 中的代码:

<?php

class table {

    function __construct($string, $time) {

        $out = '<table cellpadding="5">';
        $out .= $this->getRow('th', 'Nom., Shuffled String, Lenght');

        for ($x = 1; $x <= $time; $x++) {

            $shuffledStr = str_shuffle($string); //Maybe this causes the problem
            $shuffledStr_len = strlen($shuffledStr);
            $out .= $this->getRow('td', $x . ', ' . $shuffledStr . ', ' . $shuffledStr_len);
        }

        $out .= '</table>';

        echo $out;
    }

    public function getRow($tagName, $contents_list) {

        //Variables:
        $out = '';
        $contents_array = explode(', ', $contents_list);
        $contents_number = count($contents_array);
        $start_tag = '<' .  $tagName . '>';
        $end_tag = '</' .   $tagName . '>';

        // Build
        $out .= '<tr>';

        for ($i = 0; $i < $contents_number; $i++) {
            $out .= $start_tag . $contents_array[$i] . $end_tag;
        }

        $out .= '</tr>';

        return $out;
    }

}
?>

这里是 index.php:

    <?php
require_once 'lib.php';
$string = ''; //My string
$shuffleTimes = 100;
$table = new table($string, $shuffleTimes);
?>

这个程序获取一个字符串和你想要洗牌的数字,然后创建一个表并返回数字、洗牌的字符串和每行中洗牌字符串的长度。

例如,如果我将变量设置$string为“堆栈溢出”,它会正常工作(它随机打乱这个词 100 次,返回所有长度 14,所有打乱字符串的长度实际上是 14。)

但...

如果我向变量添加一些特殊字符$string(例如Stack Overflow+_)(*&^%$#{}[]<>@!~./=-),它将无法正常工作。这意味着它返回长度 37 但它们没有 37 个字符!(例如,它打印nothing并打印它的长度38。我认为这有点奇怪。:(

这是为什么?!哪个角色导致了这种情况以及如何解决?

4

2 回答 2

1

您的代码存在多个问题。

1. getRow() 问题:

问题在于getRow(),您将参数连接到一个字符串中,,然后按,. 如果您的字符串,在其中,那么您将遇到问题,例如:Stack ,test.

2.多字节问题:

此代码不适用于多字节字符。要做到这一点,您将需要使用以下str_shuffle()功能更改功能mb_str_shuffle(),并strlen()使用mb_strlen().

function mb_str_shuffle($str) {
    $tmp = preg_split("//u", $str, -1, PREG_SPLIT_NO_EMPTY);
    shuffle($tmp);
    return join("", $tmp);
}

或者您在http://php.net/manual/en/function.str-shuffle.php的评论中找到的其他一些 unicode 函数

3.长度没问题,但字符串丢失问题:

这是因为您的字符串中有 HTML 特殊字符,例如<>。如果字符串Stack Overflow+_)(*&^%$#{}[]<>@!~./=-被洗牌,你会得到类似的东西a#^&/c-_O.而不是a#^&/c-_O.< ~*>)$wevS+{(%}klr[]f=to!@. 输出字符串时,应使用htmlspecialchars()转义特殊字符。

于 2013-09-10T13:09:19.257 回答
0

听起来像是编码的问题。

您是否尝试过使用可以正确处理编码的函数?

试试这个:(复制自 PHP 手册)

function unicode_shuffle($string, $chars, $format = 'UTF-8')
{
    for($i=0; $i<$chars; $i++)
        $rands[$i] = rand(0, mb_strlen($string, $format));

        $s = NULL;

    foreach($rands as $r)
        $s.= mb_substr($string, $r, 1, $format);

    return $s;
}
于 2013-09-10T13:05:34.807 回答