0

好吧,这可能很难解释。
密码对用户名不起作用。
我正在从文本文件中读取。

“用户名,密码”是下面的结构是文本文件

John,BOL12345
Mary2,BOL77777
Anna,BOL54321
test,BOL12345

前 3 个不能单独使用,我只需要前 3 个
,但是一旦我添加了“test,BOL12345”
,密码 BOL12345 就可以工作
,但没有“test,BOL12345”密码“BOL12345”不起作用或其他任何一个
我在下面的javascript中做这一切将是代码片段..请提出任何问题,因为我不明白为什么会发生这种情况。

下面的 JavaScript
“行” = 上面的文本文件

    lines = x.responseText.split("\n");
    for (i=0; i < lines.length; i++)
    {
        test1 = lines[i].split(",")
        username.push(test1[0]);
        password.push(test1[1]);

    }
    var tempUsername = document.getElementById('username').value;
    var tempPassword = document.getElementById('password').value;
    var arraycontainsusername = (username.indexOf(tempUsername) > -1);
    var arraycontainspassword = (password.indexOf(tempPassword) > -1);
    alert(password);
    if (arraycontainsusername && arraycontainspassword) {
        window.location.href = "listing.htm";
    };
4

1 回答 1

1

有根据的猜测:您的文件正在使用\r\n. 因为你被留下了分裂\n\r破坏了每个字符串。尝试分开\r\n,看看会发生什么。这可以解释为什么添加最后一行会起作用,因为最后没有换行符,不会有尾随字符来搞乱indexOf搜索。

不同的操作系统处理文本文件的方式不同。Windows 使用 CRLF(回车换行)跳转到下一行,而 *NIX 变体使用 LF。旧的 MacOS 版本使用 CR。您的代码假设文件来自 *NIX 环境,其中 LF (or \n) 是规范,当它来自 Windows 环境时,CRLF (or \r\n) 是规范(不准确,因为您可以使用 LF 制作文本文件windows 和 *NIX 中的 CRLF,买你得到图片)。

为了正确处理所有情况,我建议在处理之前对字符串进行规范化:

x.responseText.replace(/\r\n|\r(?!\n)/g, '\n').split('\n');

中间那个看似中文的字符串实际上是匹配 \r\n 或 \r 的正则表达式(但仅当 \r 后面没有 \n 时)。这样,您可以将所有 CRLF 和 CR 替换为 LF 并处理来自任何环境的文本。

由于令牌的顺序,您可以简化该正则表达式 to /\r\n|\r/,但我将其保留,因为它说明了一个简洁的概念(前瞻-该位(?!\n)表示当且仅当不紧跟 a 时\n)。话虽/\r\n|\r/如此,性能会更好,尤其是在处理大文件时

于 2014-10-17T04:34:53.787 回答