【问题标题】:Markdown/Jekyll: Auto-surround bare URLs with angle brackets?Markdown/Jekyll:用尖括号自动环绕裸 URL?
【发布时间】:2020-10-05 14:37:11
【问题描述】:

我注意到一些 Markdown 解析器和 GitHub 会自动将裸 URL 转换为链接,但其他 (like Kramdown) 不会。标准 Markdown 语法要求 URL 用尖括号括起来,例如<https://www.google.com/>.

我的 Markdown 编辑器中有许多带有裸 URL 的文档,例如超链接,但是当我在 Jekyll 中将它们推送到 GitHub Pages 时,它们没有呈现为链接。

如何编写脚本来用尖括号括住裸 URL? 最好通过 shell 脚本、标准命令行工具(sed、awk)或 Python。或者也许已经有一个 Jekyll 插件了?

我知道匹配的 URL 非常重要,所以在深入研究之前想在这里询问一下。

进一步的困难:解决方案应该只更改 URL,而不要使用已经通过符合标准的 Markdown 或 HTML 包装/编码的 URL。

(我希望这是一个常见问题,它在各种 GitHub-Issues 帖子中针对各种包,没有解决方案......但是尝试在这里搜索这个问题并不能发现它已经被问到了,@ 987654322@。我发现了很多关于在尖括号已经存在时匹配的问题,但不是添加尖括号的问题。但我想象解决方案已经实现了很多,很多时候——在我们使用的工具中,比如 GitHub 和 MathOverflow——所以,不知道为什么这样做的方法没有被广泛发布。)

【问题讨论】:

  • this 有帮助吗?
  • GitHub 在github/markup 中记录了他们的过程。自动链接发生在第 4 步,与 Markdown 处理(在第 1 步中)分开。不幸的是,它们没有链接到处理此问题的代码,但是如果您深入研究提交历史记录,您可能会找到指向他们不再使用的旧解决方案的链接。我知道他们过去链接到的链接比现在更多。我只是不确定他们是否曾经链接到解决方案的那部分。
  • ... 无论哪种方式,请注意,这发生在 Markdown 转换为 HTML 之后。据推测,GitHub 正在将 HTML 传递给 HTML 解析器,逐步遍历文档树,并对文本运行过滤器。这样可以轻松避免代码块、现有链接等。
  • @Mandy8055 哇,成功了!它甚至留下了我添加的包含普通 HTML 和 Markdown 链接的字符串。即使是包含许多不寻常字符的又长又复杂的谷歌搜索字符串!
  • 我添加了 asnwer @sh37211;请检查

标签: html regex markdown jekyll


【解决方案1】:

你可以试试下面的正则表达式:

(?!<)^(https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&\/\/=]*))(?!>)$

上述正则表达式的解释:

  • (?!&lt;) - 如果字符串以 &lt; 开头,则表示与字符串不匹配的负前瞻。

  • ^, $ - 分别代表行的开始和结束。

  • (https?:\/\/(?:www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b(?:[-a-zA-Z0-9()@:%_\+.~#?&amp;\/\/=]*)) - 这部分有效匹配所有可能的有效 url。

  • (?!&gt;) - 如果 url 以 &gt; 结尾,则表示否定前瞻不匹配。

你可以在here.找到上述正则表达式的demo


注意:如果涉及到 bash 中的实现,我也更喜欢使用 perl 命令。但是,如果您需要使用 sed,那么您可以尝试以下命令。 但是;请注意sed 错过了正则表达式的许多惊人功能;环顾四周,未捕获的组等。

sed -E 's@^[^<]?(https?://(www\.)?[-a-zA-Z0-9@:%._\+~#=]{1,256}\.[a-zA-Z0-9()]{1,6}\b([-a-zA-Z0-9()@:%_\+.~#?&/=]*))[^>]?$@<\1>@gm'

您可以在 here.

中找到 perl 和 sed 实现的示例运行

【讨论】:

  • 我已经确认 perl 或 sed 表达式都可以满足我的需要,因此足以接受您的回答。 sed 优于 perl 只是因为我提议更改另一个人的软件套件,而 sed 总是保证安装,我不确定他是否将 perl 添加到他的 docker 映像中(或想要),所以这将是一个额外的依赖。对于我个人使用,perl 很好。也许 perl 也是“标准”的,我只是想通过使用 sed 让我的更改“易于采用”。
  • 如果你喜欢,去吧!我一直无法想出一个可以“破坏” perl 正则表达式的 URL,但始终欢迎使用更强大的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2010-09-18
  • 1970-01-01
  • 2014-07-28
  • 2021-03-01
  • 2020-05-21
  • 1970-01-01
相关资源
最近更新 更多