Javascript\Node.JS抓取逻辑,在字符串中查找时间
我正在尝试创建一个通过本地站点获取事件信息的刮板。我在提取事件时间时遇到问题,因为每个人都以不同的格式输入事件时间。不管怎么说,我想知道是否有一个好方法来寻找这些“上午、上午、下午、下午”中的一个,然后在上午或下午之前得到任何数字 我知道有类似的事情,但它不够动态Javascript\Node.JS抓取逻辑,在字符串中查找时间,javascript,jquery,node.js,web-scraping,Javascript,Jquery,Node.js,Web Scraping,我正在尝试创建一个通过本地站点获取事件信息的刮板。我在提取事件时间时遇到问题,因为每个人都以不同的格式输入事件时间。不管怎么说,我想知道是否有一个好方法来寻找这些“上午、上午、下午、下午”中的一个,然后在上午或下午之前得到任何数字 我知道有类似的事情,但它不够动态 var rawTime = "String blab la bla 10:00 p.m."; toParse = rawTime.substring(rawTime.indexOf('p.m.') - 6); 最
var rawTime = "String blab la bla 10:00 p.m.";
toParse = rawTime.substring(rawTime.indexOf('p.m.') - 6);
最好的办法是找到indexOf,创建一个数组,然后让while循环“后退”,直到返回一个空格或非数字
但是我会遇到这样的问题,人们会在晚上10:00和10:00输入。因为在下午之前有一个空格。最好是使用正则表达式,因为它完全支持人类输入时间所需要的模糊模式匹配
/\d{1,2}(:\d{2})?\s*([ap][.]?m[.]?)?/i
可以,它也支持上午10点和上午9点。下面是一个代码示例,可以用于您的示例
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]);
}
var ts=[];
ts.push(“字符串blab la bla晚上10:00”);
ts.push(“字符串blab la bla 10:00 pm”);
ts.push(上午10:00时的弦乐);
ts.push(上午10:00时的弦乐);
对于(var i=0;i我不是正则表达式大师,但希望这能帮助您:
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)我写了一些东西,我不确定我的逻辑是否正确。我认为它应该采用几乎任何格式。唯一的问题是,如果字符串前面有一个数字,例如一个价格……那么,尝试解决这个问题可能会很奇怪
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点的时候输入,也应该可以。我只需要想一想如何在时间之前清除任何东西,在这种情况下,这可能会发生。我想这将获得相当数量的好数据。如果有人有更好的解决方案,请告诉我。我知道这是一个很大的过度编码,我可以将其减少一点,我只是更直观艾尔比大多数人都好