如何安全区分ISO 8601字符串和在不带正则表达式的queryParams中存储为字符串的数字

时间:2019-06-13 16:09:04

标签: javascript lodash query-parameters

例如,我在url als查询参数中存储了日期和金额属性

  

...?date = 2019-06-12T06:20:39.465Z&amount = 20000

我希望能够解析所有查询参数,并使用javascript将它们分配给正确的类型。

我正在使用

        paramMap.keys.forEach(key => {
            let value: any = paramMap.get(key);
            if (isFinite(Date.parse(value))) {
                // keep as string
            } else if (isFinite(parseInt(value, 10))) {
                value = isInteger(value) ? parseInt(value, 10) : parseFloat(value);
            } else if (value === 'true' || value === 'false') {
                value = value === 'true';
            }
            obj[key] = value;
        });
        return obj;

在这种情况下,金额= 20000将被Date.parse识别。

2019-06-12T06:20:39.465Z将使用parseInt ...解析为2019年...

isFinie,parseInt和isInteger是从lodash导入的。

如果可能的话,我不想使用正则表达式。

编辑:请假定我不知道密钥的名称。因此,该脚本应适用于所有属性。

2 个答案:

答案 0 :(得分:2)

ISO可能会省略秒,时区或毫秒,但是如果忽略这些内容,并检查所有其他内容,则可以可靠地检查不同的ISO格式。

$main_url= parse_url($_SERVER['REQUEST_URI'], PHP_URL_PATH);
$main_url_segment= explode('/', $main_url);
$url_2= $main_url_segment[2];
$is_page ="page-to-run-script";
if($is_page == $url2){
   // run script A...
} else {
   // run script B...
}

答案 1 :(得分:1)

使用+ operatorNumber函数或lodash的_.toNumber()可以为混合数字的字符串返回NaN

console.log(+'2019-06-12T06:20:39.465Z')

console.log(+'20000')

因此逻辑将是:

const parseParam = value => {
  let v = +value

  if (!isNaN(v)) return v

  v = Date.parse(value)

  if (!isNaN(v)) return v

  if (value === 'true' || value === 'false') return value === 'true'

  return value
}

console.log(parseParam('2019-06-12T06:20:39.465Z'))
console.log(parseParam('20000'))
console.log(parseParam('false'))
console.log(parseParam('cats'))