【问题标题】:Is there a more reliable way to catch line breaks and wrap up the text?有没有更可靠的方法来捕捉换行符并包裹文本?
【发布时间】:2017-05-09 19:44:16
【问题描述】:

我编写了一个用户脚本,能够自动将粘贴到文本框(由用户脚本注入页面)中的运输详细信息插入到适当的字段中。数据由另一个脚本生成,该脚本将新条目读入电子表格,其格式如下:

Name :: Simon

Email :: simon@example.com

Address 1 :: Castle 1

...

但是,有时某些数据会被分解为第二行(出于某种原因,通常只发生在电子邮件地址中),这意味着它看起来像这样:

...

Email :: 
simon@example.com

...

所以,我做了它,以便用户脚本也捕获这些,读取粘贴数据的函数如下所示:

$('#paste-box').on('paste', function(){
    setTimeout(function() {
        var rawData = $('#paste-box').val();
        var data = {};
        rawData = rawData.replace(' :: \n', ' :: ');  //this is the line that catches lines spilling into second line
        rawData = rawData.split('\n');
        for (var i = 0; i < rawData.length; i++) {
            line = rawData[i].split(' :: ');
            if (line.length == 2) data[line[0]] = line[1];
        }

这段代码似乎工作得很好——我还没有偶然发现它没有捕捉到换行符。但我想知道:有没有更优雅和/或更可靠的方法来捕捉这些?

【问题讨论】:

    标签: jquery line-breaks


    【解决方案1】:

    如果可能的话,我会将文本到对象的转换拆分为自己的函数。然后,如果您愿意,可以将替换、拆分和长度检查捆绑到一小串神秘字符中。或者,换句话说,使用RegExp

    function parseRawData(rawData) {
        var data = {};
        var re = /^(.*) :: \n?(.*)$\n*/gm;
        var match;
        while ((match = re.exec(rawData)) !== null) {
            data[match[1]] = match[2];
        }
        return data;
    }
    

    这为您提供了一些余地来发现和解决更多的奇怪问题。可以断言整个粘贴字符串已被消耗,在不匹配的情况下打印剩余的文本,并调整您的表达式以应对。

    【讨论】:

    • 为了确保我得到这个,正则表达式正在寻找:输入的开头,后跟任何不是换行符的字符串,然后是::,两边都用空格填充, 后跟 sometimes 一个新行,后跟任何不是新行的字符串(再次),然后在输入的结尾加上换行符?除此之外,data[match[1]] = match[2] 在这里如何工作?这个想法是 data 是一个键值对象的集合——例如 'Name': 'Simon' 的形式——它还会这样做吗?
    • 捕获括号将这些部分放入 match 数组中,从索引 1 开始(0 是全部)。请注意,re.exec() 是一个全有或全无的东西,它将返回 null,永远不要在数组的一部分中放入任何东西然后失败。最后,re 对象有一个 lastIndex 属性,所以每次循环都从它停止的地方开始,所以会遍历所有的对。
    猜你喜欢
    • 2016-05-30
    • 2012-08-22
    • 2015-11-07
    • 1970-01-01
    • 1970-01-01
    • 2022-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多