Substr从一个字符或另一个字符开始

时间:2016-06-26 13:49:49

标签: javascript regex substr lastindexof

我有一个带参数的函数,需要将该参数作为原始字符串的子字符串返回:

var $ = function (selector) {
  var elements = [];

  var selectorSubstr = selector.substr(selector.lastIndexOf(".") || selector.lastIndexOf("#") + 1);

  return selectorSubstr;
};

参数都是html元素:

$("div") => “分区”

&安培;

$("img.some_class") => “some_class”

&安培;

$("div.some_class#some_id") => “SOME_ID”

&安培;

$("div#some_id.some_class") => “some_class”

我需要lastIndexOf从'。'的最后一个实例开始。对于html类或对于html id为“#”。

目前lastIndexOf仅适用于第一个参数,并未考虑'||'为'或其他论点。

有什么建议吗?

3 个答案:

答案 0 :(得分:2)

始终第一个条件为真,因为两个选择器都有.,因此最后一个索引总是在第一个条件中定义。

var classSelector = selector.lastIndexOf('.')? -1 : selector.lastIndexOf('.');
var idSelector = selector.lastIndexOf('#')? -1: selector.lastIndexOf('#');
if(idSelector>classSelector)
selector.subStr(idSelector+1);
else
selector.subStr(classSelector+1);

答案 1 :(得分:1)

对于像这样的问题,对于许多其他像lodash这样的库来说非常方便。它们将为您节省大量时间。例如,指向lastIndexOf的链接支持fromIndex来告诉它从哪里开始等。

你也可以轻松地在你的情况下做到这一点但是在一天结束的时候你会遇到很多其他类似的问题,其中1个函数调用lodash会解决它最好只是添加它作为你的一部分工具带imo。

答案 2 :(得分:1)

var $ = function (selector) {
  return selector.match(/[#\.][^\.#]+$/);
}

$("img.some_class")[0]; // ==> '.some_class'
$("div.some_class#some_id")[0]; // ==> #some_id
$("asbasifhwaehf"); // ==> null, no match

编辑:解决@ Joe的要求,我进行此编辑以返回整个输入字符串,以防它不包含#或。

var $ = function (selector) {
  var arr = selector.match(/[#\.][^\.#]+$/);
  return arr ? arr[0] : selector
}

$("img.some_class"); // ==> '.some_class'
$("div.some_class#some_id"); // ==> '#some_id'
$("asbasifhwaehf"); // ==> 'asbasifhwaehf', no match

获取没有的字符串。或#prefix,只需致电

$("div.some_class#some_id").slice(1); // ==> 'some_id'

你也可以在函数中return arr ? arr[0].slice(1) : selector,但是你无法从返回值