gpt4 book ai didi

javascript - 无法替换\r 字符

转载 作者:行者123 更新时间:2023-11-30 11:41:51 25 4
gpt4 key购买 nike

我尝试了很多,每次编写代码时创建 HTML 模板(空白、 Canvas 、应用程序等)有点令人沮丧。我可以在 Notepad++ 中为各种模板创建宏,但手动执行此操作效率不高。因为我已经弄清楚宏是如何保存的,所以在shortcuts.xml文件,格式如下:

<NotepadPlus>
<InternalCommands>
<Shortcut id="42023" Ctrl="yes" Alt="no" Shift="yes" Key="81" />
</InternalCommands>
<Macros>
<Macro name="Blank HTML5" Ctrl="no" Alt="no" Shift="no" Key="0">
<Action type="1" message="2170" wParam="0" lParam="0" sParam="&lt;" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="!" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="D" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="O" />
<Action type="1" message="2170" wParam="0" lParam="0" sParam="C" />

我考虑过以编程方式创建模板,这就是我想到的:jsfiddle

var inputBox = document.getElementById("input");
var outputBox = document.getElementById("output");
var convertButton = document.getElementById("convert");

var dict = [
[/</, "&lt;"],
[/>/, "&gt;"],
[/\r/, "&#x000D;"],
[/\n/, "&#x000A;"],
];

convertButton.onclick = function convertTextToMacro() {
var chars = inputBox.value.split("");
var macro = '<Macro name="" Ctrl="no" Alt="no" Shift="no" Key="0">\r\n';
for (var i = 0; i < chars.length; i++) {
var c = chars[i];
for (var j = 0; j < dict.length; j++) {
c = c.replace(dict[j][0], dict[j][1]);
}
macro += ' <Action type="1" message="2170" wParam="0" lParam="0" sParam="' + c + '">\r\n';
}
macro += '</Macro>';
outputBox.value = macro;
};
* {
margin: 0;
padding: 0
}

body {
background: gainsboro;
}

#main {
display: table;
margin: 20px auto;
background: rgb(250, 250, 250);
padding: 20px;
border: 1px solid darkgray;
box-shadow: 0 0 2px rgba(0, 0, 0, .2);
}

textarea {
padding: 5px;
width: 600px;
height: 300px;
display: block;
font-size: 13px;
line-height: 1.5;
}

#input {
height: 150px;
}

input {
display: block;
padding: 5px 10px;
margin: 5px 0;
}
<div id="main">
<textarea id="input" placeholder="Input">
<html>
<body></body>
</html>
</textarea>
<input type="button" id="convert" value="Create macro" />
<textarea id="output" placeholder="Output"></textarea>
</div>

有4个字符需要转义:

var dict = [
[/</, "&lt;"],
[/>/, "&gt;"],
[/\r/, "&#x000D;"],
[/\n/, "&#x000A;"],
];

我可以替换< , > , 和 \n , 但似乎无法替换 \r .奇怪的是,这似乎只发生在这种特殊情况下。如果我省略 \n

var dict = [
[/</, "&lt;"],
[/>/, "&gt;"],
[/\r/, "&#x000D;"],
// [/\n/, "&#x000A;"],
];

我得到了不同的输出:jsfiddle

在下面的例子中:

var greet = "Hello\rWorld".replace(/\r/, "&#x000D;");
console.log(greet); // "Hello&#x000D;World"

var chr = "\r".split("")[0].replace(/\r/, "&#x000D;");
console.log(chr); // "&#x000D;"

\r被替换。我做错了什么?

最佳答案

问题是您的文本区域中实际上没有任何\r 字符。

\r为回车符,\n为换行符。在 Windows 上,每个新行都由两个字符表示:\r\n 在 Linux 上它只是 \n

为了让您不必为此担心,浏览器正在剥离 \r 并只留下 \n

您可以看到这种情况,因为您可以在运行代码之前重新添加 \r 字符以与每个 \n 一起使用(这有点毫无意义,但显示你的其余代码没问题)

 var inputBox = document.getElementById("input");
var outputBox = document.getElementById("output");
var convertButton = document.getElementById("convert");

var dict = [
[/</, "&lt;"],
[/>/, "&gt;"],
[/\r/, "&#x000D;"],
[/\n/, "&#x000A;"]
];

convertButton.onclick = function convertTextToMacro() {
var value = inputBox.value.replace(/\n/g,'\r\n');
var chars = value.split("");
var macro = '<Macro name="" Ctrl="no" Alt="no" Shift="no" Key="0">\r\n';
for (var i = 0; i < chars.length; i++) {
var c = chars[i];
for (var j = 0; j < dict.length; j++) {
c = c.replace(dict[j][0], dict[j][1]);
}
macro += ' <Action type="1" message="2170" wParam="0" lParam="0" sParam="' + c + '">\r\n';
}
macro += '</Macro>';
outputBox.value = macro;
};

所以问题是您真的需要包含 \r 字符吗?如果您这样做,我不确定是否有文本框解决方案。

我不是 100% 确定所有浏览器都这样做 - 所以在开始之前可能值得剥离它们以防万一 var value = inputBox.value.replace(/\r/g,'');

关于javascript - 无法替换\r 字符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42352910/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com