我有一个由Windows程序和ASP页面共享的数据库。在Windows程序中输入了一个包含多个CR / LF字符的字符串。它在textarea中按预期显示,但是javascript indexOf()方法无法在消息中找到字符串。 indexOf()方法适用于不包含CR / LF字符的任何其他字符串。如果字符串包含在整个消息中,我需要做什么?
例如,如果邮件包含:
您的信用卡对帐单上写着“公司”。如果您对此发票有任何疑问,请与我们联系。
感谢您与本公司开展业务 在移除之前将胶带留在原位24小时。
我要匹配的字符串是:
您的信用卡对帐单上写着“公司”。如果您对此发票有任何疑问,请与我们联系。
感谢您与公司做生意。
indexOf()返回-1。我已经验证我正在搜索的字符串包含我想要找到的字符串。
失败的代码。
var index = message.indexOf(listbox.getItem(i).get_toolTip());
答案 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;
}