簡體   English   中英

無法替換\\ r \\ n字符

[英]Can't replace \r character

每當我的代碼有點令人沮喪時,我會進行大量實驗並創建HTML模板(空白,畫布,應用程序等)。 我可以在Notepad ++中為各種模板創建宏,但手動執行此操作並不那么有效。 由於我已經在shortcuts.xml文件中找到了如何保存宏的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被替換。 我究竟做錯了什么?

問題是你的textarea中實際上沒有任何\\ r \\ n字符。

\\r是回車符, \\n是換行符。 在Windows上,每個新行都由兩個字符表示: \\r\\n在linux上它只是\\n

為了避免您擔心這個問題,瀏覽器正在剝離\\r \\n並且只留下\\n

您可以看到這種情況,因為您可以在運行代碼之前重新添加\\r \\n字符以與每個\\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,'');

嘗試更換\\r\\n代替\\r

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM