javascript - 需要帮助使用正则表达式使代码优雅

标签 javascript jquery regex

首先我会说我不是程序员,但我确实喜欢四处探索和学习。这是我拥有的:

1) URL 格式如下:http://site.com/#!/show/me/stuff/1-12/

2) 输出可用页面数量的 jQuery 分页脚本。每个数字都是一个带有 href="#pageNumber"

的链接

3) 绑定(bind)到所有分页链接的 jQuery 脚本。功能代码如下。

基本上,如果我选择第 2 页,我的目标是用正确的值替换 URL 中的 1-12。

这是我编造出来的但非常丑陋的东西:

var pageId = this.href.split("#")[1]; 
// this gets the number from the pagination link (i.e.,
// http://site.com/#2 becomes 2)

var url = location.hash.split("/");
var url = url[url.length-2];
// this is my way of extracting "1-12" from the URL :)

var showFrom = parseFloat(url.split("-")[0]); // 1
var showTo = parseFloat(url.split("-")[1]); // 12
var itemsPerPage= (showTo-showFrom)+1; // 12
var newShowTo = (itemsPerPage*pageId); // 24
var newShowFrom = (itemsPerPage*pageId)-itemsPerPage+1; // 13
var newUrl = newShowFrom+"-"+newShowTo; // 13-24

location.hash = location.hash.replace(url, newUrl);
// http://site.com/#!/show/me/stuff/1-12/ now becomes
// http://site.com/#!/show/me/stuff/13-24/

我怎样才能用更少的步骤让它更优雅?

最佳答案

您的代码并没有那么难看 - 变量名是不言自明的,我可以向您保证,我们都见过更糟的事情。

无论如何,这里有一种方法可以做与您所做的相同的事情,但使用的是正则表达式:

var pageId = this.href.split("#")[1];   
var pattern = /\/(\d+)-(\d+)\/?$/;
location.hash = location.hash.replace(pattern, function(_, showFrom_str, showTo_str){
    var showFrom = parseInt(showFrom_str, 10);
    var showTo   = parseInt(showTo_str, 10);
    var itemsPerPage = showTo - showFrom + 1;
    return '/' + ((itemsPerPage * pageId) - itemsPerPage + 1) + '-' + (itemsPerPage * pageId) + '/';
});

工作原理:

模式:斜杠\/,后跟一个或多个+ 数字\d,后跟连字符 -,后跟另一个数字序列 (\d+),后跟可选的 ? 斜杠 \/,后跟字符串 $ 的结尾。

替换:我们可以将替换函数传递给替换方法,以便替换文本依赖于替换文本。该函数的第一个参数是整个匹配项 ("/1-12/"),我们忽略它(_ 是“忽略此”的约定)。

下一个参数对应于正则表达式中捕获的模式 - 那些用括号括起来的东西。在您的例子中,参数是范围开始和结束数字的字符串表示形式。

然后我只使用与您相同的逻辑,除了

  • 我使用了 parseInt 而不是 parseFloat。 (尽管不要忘记基数的第二个参数,否则“08”会咬你)
  • 我使用了较少的中间变量。

最后,所有正则表达式都摆脱了字符串拆分并稍微简化了代码。但是,在实际情况下,我可能会尝试考虑一个不依赖于 URL 上脆弱的字符串操作的更强大的解决方案。

关于javascript - 需要帮助使用正则表达式使代码优雅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8264119/

相关文章:

regex - 正则表达式用逗号分隔

html - 禁止在 html5 输入字段中使用 @ 字符

javascript - Ajax回调后未检测到点击

javascript - Cytoscape.js 警告 : "The style value of ` label` is deprecated for `width` "when trying to have a node with same width of label

jquery - Slick Slider Next Arrows 不显示

php - jquery 类,打开两个相同的

javascript - 为什么我在 bootstrap 中的数据表看不到包含的数据?

javascript - 将 Metabox 关联到 WordPress 中的自定义页面模板

jquery - 在处理程序上将数据作为 jquery 中的字符串发送

regex - 关于文件夹名称的正则表达式