0

我有一个由 Windows 程序和 ASP 页面共享的数据库。在 windows 程序中输入了一个包含多个 CR/LF 字符的字符串。它在文本区域中按预期显示,但 javascript indexOf() 方法无法在消息中找到字符串。indexOf() 方法适用于任何其他不包含 CR/LF 字符的字符串。我需要做什么来查找字符串是否包含在整个消息中?

例如,如果消息包含:

您的信用卡对帐单将显示“The Company”。当与我们联系以询问有关此发票的问题时,请使用您的订单号。

感谢您与本公司开展业务。
将胶带留在原位 24 小时,然后再取下。

我要匹配的字符串是:

您的信用卡对帐单将显示“The Company”。当与我们联系以询问有关此发票的问题时,请使用您的订单号。

感谢您与本公司开展业务。

indexOf() 返回 -1。我已验证我正在搜索的字符串包含我要查找的字符串。

失败的代码。

var index = message.indexOf(listbox.getItem(i).get_toolTip());
4

3 回答 3

1

所以我知道这是一个老问题,但我想给出一个比 URL 编码更好的答案。

我遇到了同样的问题,但 URL 编码并没有像 Jac 发布的那样解决我的问题。然而,它确实让我能够排除故障并找到根本原因。

原因是 textarea 只接受换行符 (/n) 并将任何其他换行符类型(/r/n 和 /r)转换为换行符。因此,在搜索时indexOf仅使用在字符串中添加换行符并搜索它来工作。

在下面的示例中,我还包括了输入元素。输入元素只是删除插入的任何换行符。

let haystack = 'I contain a line break\nFind me';
$('#textarea').val(haystack);
$('#rn').html($('#textarea').val().indexOf('\r\n'));
$('#r').html($('#textarea').val().indexOf('\r'));
$('#n').html($('#textarea').val().indexOf('\n'));

$('#input').val(haystack);
$('#inrn').html($('#input').val().indexOf('\r\n'));
$('#inr').html($('#input').val().indexOf('\r'));
$('#inn').html($('#input').val().indexOf('\n'));
<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
<textarea id="textarea" cols="25" rows="3"></textarea>
<br>
<p>Place where line break occurs in textarea looking for \r\n: <span id="rn"></span></p>
<p>Place where line break occurs in textarea looking for \r: <span id="r"></span></p>
<p>Place where line break occurs in textarea looking for \n: <span id="n"></span></p>

<input type="text" id="input" />
<p>Place where line break occurs in textarea looking for \r\n: <span id="inrn"></span></p>
<p>Place where line break occurs in textarea looking for \r: <span id="inr"></span></p>
<p>Place where line break occurs in textarea looking for \n: <span id="inn"></span></p>

于 2020-05-21T18:36:57.557 回答
0

CR/LF 对确实存在于字符串中,但是当 HTML 呈现引擎布置段落时,它们被视为嵌入的空白并被忽略。但是,当您搜索时,JavaScript 不会忽略CR/LF 字符。

于 2013-11-12T22:54:19.013 回答
0

我不知道为什么会发生这种情况,但是 textarea 会按预期显示嵌入的 CRLF,但只是将字符串分配给变量并使用indexOf()每次搜索的字符串包含 CRLF 时返回 -1。我求助于在encodeURI()正在搜索的字符串上使用该方法,并且在使用之前正在搜索的字符串indexOf(),这是有效的。

function messageContainsString(string) {
    var orderMessage = $get('<%=uxMessageOrderMessage.ClientID%>')
    if (orderMessage != null) {
        var message = encodeURI(orderMessage.textContent);
        if (message != null) {
            return message.indexOf(encodeURI(string)) > -1;
        }
    }
    return false;
}
于 2013-11-13T17:24:24.577 回答