如果String包含回车符/换行符,则indexOf()失败

时间:2013-11-12 22:52:44

标签: javascript asp.net

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

例如,如果邮件包含:

  

您的信用卡对帐单上写着“公司”。如果您对此发票有任何疑问,请与我们联系。

     

感谢您与本公司开展业务   在移除之前将胶带留在原位24小时。

我要匹配的字符串是:

  

您的信用卡对帐单上写着“公司”。如果您对此发票有任何疑问,请与我们联系。

     

感谢您与公司做生意。

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

失败的代码。

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

3 个答案:

答案 0 :(得分:1)

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

我遇到了同样的问题,但是在Jac发布时,URL编码无法解决我的问题。但是,它确实允许我进行故障排除并找到根本原因。

原因是因为textarea仅接受换行符(/ n),并将任何其他换行类型(/ r / n和/ r)转换为换行符。因此,在使用indexOf进行搜索时,只需在字符串中放入换行符并进行搜索即可。

在下面的示例中,我还包括了input元素。输入元素只会删除所有插入的换行符。

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>

答案 1 :(得分:0)

CR / LF对实际上在字符串中,但是当HTML呈现引擎列出段落时,它们被视为嵌入式空格并被忽略。但是,当您搜索时,JavaScript 忽略CR / LF字符。

答案 2 :(得分:0)

我不知道为什么会发生这种情况,但textarea会按预期显示嵌入式CRLF,但只是将字符串分配给变量并且每次搜索的字符串包含CRLF时使用indexOf()返回-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;
}