【问题标题】:GitHub.com heading links - JavaScript [closed]GitHub.com 标题链接 - JavaScript [关闭]
【发布时间】:2024-05-15 16:20:01
【问题描述】:

有谁知道 GitHub.com 使用什么是正确的官方算法来编码内部标题的 fragment_id 链接?

(我希望这不再被视为过于宽泛的问题)。

我对 GitHub 风格的 Markdown 格式链接到内容标题的方式进行了逆向工程。这似乎很奇怪,所以我想我做错了什么。也许您知道如何改进它(链接除外,为了步骤的可读性,此处略过)。

首先我发现这样一个字符串 1.2.3-a Łukasz_testing? header `special characters`;.,links How+they%20 behave 将在那里编码为 123-a-%C5%81ukasz_testing-header-special-characterslinks-howthey20-behave.

我重新创建了相同的结果:

function(string) {
    string = string.replace(/[A-Z]+/g,function(v) { return v.toLowerCase(); });
    string = string.replace(/[^a-z0-9-\s\u00BF-\u1FFF\u2C00-\uD7FF\w]+/g,'');
    string = string.replace(/[\s\t ]+/g, '-');
    string = encodeURIComponent(string);
    return string;
}

但它看起来很笨重。任何想法它与原版有多接近?

【问题讨论】:

  • 你可以链接所有replace
  • string.replace(/[A-Z]+/g,function(v) { return v.toLowerCase(); });,不只是string.toLowerCase()?这也是题外话。你可以试试codereview.stackexchange.com
  • 我投票结束这个问题,因为它要求审查工作代码。或许应该迁移到codereview
  • @meagar 不可能,因为它们不会小写非 ascii 字母数字字符

标签: javascript regex github utf-8 encode


【解决方案1】:

我同意@elclanrs,链接看起来更简洁:

function(string) {
    return encodeURIComponent(string.replace(/[A-Z]+/g,function(v) { return v.toLowerCase(); })
                                    .replace(/[^a-z0-9-\s\u00BF-\u1FFF\u2C00-\uD7FF\w]+/g,'')
                                    .replace(/[\s\t ]+/g, '-'));
}

我不会寻找“明智的”实现(例如“一个正则表达式来统治所有这些”),这个实现简单易读 - 这将使其易于维护。

【讨论】: