【问题标题】:Javascript\Node.JS Scraping Logic, finding time in stringJavascript\Node.JS 抓取逻辑,在字符串中查找时间
【发布时间】:2014-04-02 23:27:38
【问题描述】:

我正在尝试创建一个通过本地站点并获取事件信息的抓取工具。我在提取事件时间时遇到问题,因为每个人都以不同的格式输入它。无论如何,我想知道是否有一种好方法可以查找其中一个“上午、上午、下午、下午”,然后在上午或下午之前获取任何数字。

我知道有这样的东西,但它不够动态。

var rawTime = "String blab la bla 10:00 p.m.";
toParse = rawTime.substring(rawTime.indexOf('p.m.') - 6);

最好的办法是找到 indexOf,创建一个数组,然后让 while 循环“向后”执行,直到返回一个空格或非数字?

但是我会遇到人们在晚上 10:00 输入的问题。和晚上 10:00因为下午之前有空格

【问题讨论】:

    标签: javascript jquery node.js web-scraping


    【解决方案1】:

    我写了一些东西,我不确定我的逻辑是否正确。我认为它应该接受几乎任何格式。唯一的问题是,如果字符串前面有一个数字,例如价格……那么想办法解决这个问题可能会很奇怪。

    var re = /(a.m.|p.m.|pm|am)/g, // Filter By 
    str = "String blab la bla 10 to 12:00 a.m. asdfasdfas"; // String To Test
    
    var timeArray = new Array();
    var timeStamp = new Array();
    
    while ((matcher = re.exec(str)) != null) {
        timeArray.push(matcher.index);
        timeStamp.push(matcher[0]);
    }
    
    // Get Start And End Time
    startTime = str.substring(timeArray[0] - 6, timeArray[0]);
    finishTime = str.substring(timeArray[1] - 13, timeArray[1]);
    
    if (startTime.length == 2) {
        finishTime = startTime.substr(1,2);
        startTime = startTime.slice(0,1);
    } else {
    console.log(finishTime);
    var matches = /(-|to|till)/g;
    
    if (finishTime.match(matches) != null) { 
    
        var splitTime = startTime.split( matches );
        var slpitTimeFinish = finishTime.split( matches );
    
        if (timeStamp.length > 1) {
            finishTime = slpitTimeFinish[2].replace(/[A-Za-z$.]/g, "");
            startTime = splitTime[0].replace(/[A-Za-z$.]/g, "");
        } else {
            finishTime = slpitTimeFinish[2].replace(/[A-Za-z$.]/g, "");
            startTime = slpitTimeFinish[0].replace(/[A-Za-z$.]/g, "");
        }
    
        startTime = startTime.replace(/\s+/g, ''); // Remove Spaces
        finishTime = finishTime.replace(/\s+/g, ''); // Remove Spaces
    
    } else {
        finishTime = finishTime.replace(/[A-Za-z$.]/g, "");
        finishTime = finishTime.replace(/\s+/g, ''); // Remove Spaces
    
        startTime = startTime.replace(/[A-Za-z$.]/g, "");
        startTime = startTime.replace(/\s+/g, ''); // Remove Spaces
    
     }
    }
    
    // Get Time Stamp
    
    if (timeStamp.length > 1) {
        eventStartStamp = timeStamp[0];
        eventEndStamp = timeStamp[1];
    } else {
        eventStartStamp = timeStamp[0];
        eventEndStamp = timeStamp[0];
    }
    
    
    console.log ("Event Starts At "+ startTime + " " + eventStartStamp +" Ends At "+ finishTime + " " + eventEndStamp ); 
    

    这是我进行的一些测试,如果有人有更好的方法,或者建议他们的方法,我会全力以赴。这可能被过度编码。

    str = "String blab la bla 12a.m. to 1pm asdfasdfas";
    returns "Event Starts At 12 a.m. Ends At 1 pm
    
    str = "String blab la bla 12-1pm asdfasdfas";
    returns "Event Starts At 12 pm Ends At 1 pm
    
    
    str = "String blab la bla 12:00a.m. to 1:00 p.m. asdfasdfas"
    returns "Event Starts At 12 am Ends At 1 pm
    
    
    
     str = "String blab la bla 12:00 to 1:00 p.m. asdfasdfas"` 
     returns "Event Starts At 12:00 p.m. Ends at 1:00 p.m.
    
    
    str = "String blab la bla 12:00 - 1:00 p.m. asdfasdfas" 
    returns "Event Starts At 12:00 p.m. Ends at 1:00 p.m. 
    

    如果有人在晚上 7 点到 10 点加入,也应该有效。我只需要弄清楚如何在时间之前摆脱任何东西,在这种情况下可能会发生。我想这会得到相当数量的好数据。让我知道是否有人有更好的解决方案。我知道这是一个很大的过度编码,我可以减少一点,我只是比大多数人更直观。

    【讨论】:

      【解决方案2】:

      我不是正则表达式大师,但希望这会对您有所帮助:

      var rawTime = "String etc 10:00 p.m. etc etc"
      var result = rawTime.match(/(0?[1-9]|1[012]):([0-5]\d)[ ]?([APap].?[mM].?)/);
      if (result)
      {
          alert('Hour: ' + result[1] +
                '\nMinute: ' + result[2] +
                '\nAM/PM: ' + result[3].replace(/\./g, '').toUpperCase());
      }
      

      上面的正则表达式基本上匹配任何表示子午线指标的方式,大写或小写以及带或不带句点(以及在分钟后带或不带空格)。它还基本上验证了它是实时 AM/PM 时间(尽管请注意,您可能希望将其调整为“军事”时间,例如 14:15 而不是下午 2:15)

      【讨论】:

        【解决方案3】:

        以下是适用于您的示例的代码示例。

        var ts = [];
        
        ts.push('String blab la bla 10:00 p.m.');
        ts.push('String blab la bla 10:00 pm');
        ts.push('String blab la bla 10:00 am');
        ts.push('String blab la bla 10:00 a.m.');
        
        for(var i=0; i<ts.length; i++){
            var match = ts[i].match(/(\d+:?\d+)\s?[ap]\.?m/) || []
            console.log(match[1]);
        }
        

        这里是 JSFiddle http://jsfiddle.net/2qA6e/1/

        您可能必须使其更健壮以捕获所有用例,但我相信我满足了您的 4 个示例。

        编辑:更新为仅返回数字。添加用例

        【讨论】:

          【解决方案4】:

          最好使用正则表达式,因为它完全支持人类输入时间所需的那种模糊模式匹配。

          /\d{1,2}(:\d{2})?\s*([ap][.]?m[.]?)?/i
          

          可以,而且它也支持上午 10 点和上午 9 点。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-01-26
            • 1970-01-01
            • 2021-02-24
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多