- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是我的情况。我想识别链接的 Markdown(在这种情况下,只有一种特定样式的链接很好,它是这种格式: [link text](url "optional title")
,我想要做的是将此 Markdown 文本放入 <pre>
标签中url 适本地包装在 <a>
标签中。
一个伪例子:
转换
[link text](url "optional title")
到
[link text](<a href='url'>url</a> "optional title")
所以我挖出了 Markdown 解析器使用的正则表达式,它是这样的:
/*
text = text.replace(/
( // wrap whole match in $1
\[
(
(?:
\[[^\]]*\] // allow brackets nested one level
|
[^\[\]] // or anything else
)*
)
\]
\( // literal paren
[ \t]*
() // no id, so leave $3 empty
<?( // href = $4
(?:
\([^)]*\) // allow one level of (correctly nested) parens (think MSDN)
|
[^()\s]
)*?
)>?
[ \t]*
( // $5
(['"]) // quote char = $6
(.*?) // Title = $7
\6 // matching quote
[ \t]* // ignore any spaces/tabs between closing quote and )
)? // title is optional
\)
)
/g, writeAnchorTag);
*/
text = text.replace(/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?[ \t]*((['"])(.*?)\6[ \t]*)?\))/g, writeAnchorTag);
很好的评论中的分割有助于了解发生了什么,显然我需要做的就是替换 $4
子匹配 <a href='$4'>$4</a>
.
但我当然不能只做 str.replace(re,"<a href='$4'>$4</a>");
因为那会用普通链接替换我的整个 Markdown 链接标记(包括链接文本和可选标题)。我希望普通链接显示在原始 Markdown 中,这样它看起来仍然像 <pre>
中的原始 Markdown。 (但现在有一个可点击的链接)。
那么,让我们看看...
摘录 $4
:
var group_4 = str.replace(re, "$4"); // Does anybody know a more efficient way to do this? I'm not trying to replace I just need to get the 4th group
好吧,我被卡住了,因为我想坚持 "<a href='"+group_4+"'>"+group_4+"</a>"
作为 $4
的替代品.
有人给我提示吗?我很确定这是可以做到的,而且我怀疑它也可以优雅地完成。
我已经找到了一个潜在的解决方案(这是错误的),它是去除组 $4
之外的正则表达式部分.我认为这还不够,因为它不会根据链接内容进行任何实际的链接检测(即,您可以使用根本不是真实链接的内容来定义 Markdown 链接)。所以我应该使用原始的正则表达式,以确保我正在转换成 <a>
的内容。实际上是(Markdown 内联样式)链接的一部分。
最佳答案
我想我有办法利用我已知的知识来解决这个问题。只需更换原装零件即可。这意味着 $4
之前和之后必须有其他子匹配覆盖整个表达式。 .假设有一个组$x
包含从开始到 $4
的匹配项和另一组$y
包含 $4
末尾的匹配项到字符串的末尾,我所要做的就是 str.replace(re,"$x<a href='$4'>$4</a>$y")
并完成它。
现在看看是否可以修改我们的正则表达式以在向我提供这些组时不更改其接受的语言。
更新:再看一会儿它实际上很基础:
str.replace(re,"[$2]($4 $5)")
让我完成了 99% 的完全复制原始输入的方法,唯一不正确的部分是 $4
之间的空间。和 $5
在输入中是 [ \t]*
所以我所要做的就是将其包装到原始正则表达式中的一个新组中。我相信它会变成$5
所以它将是:
/(\[((?:\[[^\]]*\]|[^\[\]])*)\]\([ \t]*()<?((?:\([^)]*\)|[^()\s])*?)>?([ \t]*)((['"])(.*?)\6[ \t]*)?\))/g
^ ^
下面一行中的克拉表示添加括号的位置。
str.replace(re,"[$2]($4$5$6)")
应该产生准确的原件,所以
str.replace(re,"[$2](<a href='$4'>$4</a>$5$6)")
应该这样做。
现在剩下的就是设计一种方法来仅转义这些链接结构之外的 HTML,因为我不想转义 anchor 标记。嗯。
关于javascript - JavaScript 的正则表达式 : Replace a particular submatch group with something,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11404013/
我正在从一个旧数据库中选择数据,该数据库有一个滥用状态列。状态列中包含多条信息。值如“新联系人 YYYY”、“在线 YYYY”、“更新 YYYY”、“撤回 YYYY”等……。您可能已经猜到了,YYYY
我想使用ant的replace任务替换这样的文件之一中的 token : 版本.txt version.number=${versionNumber} build.gradle task writeV
sorted_elems 列表中有一些元素将被更改为 str 例如: sorted_elems = ['[abc]', '[xyz]', ['qwe']] 我想删除定义的字符 - [, ], ' 并打
如果替换在变量中传递,第一次和第二次替换是否等效? #!/usr/bin/env perl6 use v6; my $foo = 'switch'; my $t1 = my $t2 = my $t3
我正在做一个本地测试来比较 C# 中 String 和 StringBuilder 的 Replace 操作性能,但是对于 String 我使用了以下代码: String str = "String
我看到了所有内容,没有看到使用“--replace”的方式的内容。 如何在 wkhtmltopdf 中使用“--replace”。 请给我一个例子,谢谢。:) 最佳答案 假设您有一个页脚 my_foo
我需要在 50 多个文件中进行大量搜索/替换,并且正在使用 Sublime Text 3。 有没有办法逐步执行并交互确认每个更改?我不想要只执行所有替换的一揽子“全部替换”操作。 我正在思考 vi/v
那么“replace ”属性如何与 composer 一起使用? ?我已经阅读了 Composer 文档,但仍然不明白。搜索更多信息并没有回答我的问题。 当我查看Laravel/Framework上的
我在玩 F# 句法。 在瑞典,我们有一个游戏叫做“Backslang”(谷歌翻译自“Rövarspråk”) 规则很简单。你说的所有话都必须以特定的方式说出来。虽然人声是相同的,但每个辅音都必须用“o
是否可以在Atom或Sublime Text中对“item”一词使用“查找和替换”并将其替换为“item [i]”,其中[i]是从1开始的数字? 我有一堆看起来像这样的物品: item1 item1
我不太确定如何解释,所以我将从输出开始。我需要返回这个: { replies: [ { type: 'text', content: 'one' } { type:
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
我了解.Replace() 和-replace 之间的区别,但是什么是-replace 和[Regex]: :替换()? 我测试了以下 2 个代码,但对我来说结果完全一样。 我还引用了 PowerSh
如果我正在做类似的事情: someString.Replace("abc","").Replace("def","").Replace(@"c:\Windows","") 我怎样才能把它替换成 Reg
我是 C# 的新手,所以请原谅我的错误。 我想在每次调用该段代码时(每次调用 2-4 次)替换字符串的某些部分。我想知道哪种方法在性能方面更好:string.Replace 或 stringBuild
当我使用 call() 或 apply() 时,我遇到了问题。 console.log(String.prototype.replace === String.replace);//false 我认为
在我使用 5-10 个替换的情况下是否有必要使用 stringbuilder。 String someData = "......"; someData = someData.replaceAll("
我有一个字符串,我需要用字典中的值替换其中的标记。它必须尽可能高效。使用 string.replace 进行循环只会消耗内存(记住,字符串是不可变的)。 StringBuilder.Replace()
我正在使用具有许多不同库依赖项的 gradle 项目并使用新的 list 合并。在我的 标签我已经这样设置了: .... 但我收到错误消息: /android/MyApp/app/src/main
我正在尝试从一个数据库中的表中提取模式并将其传输到另一个数据库。以下是执行此操作的函数的一部分。 当 Table( ... ) 时出错被称为。 功能示例: def transfer_data(self
我是一名优秀的程序员,十分优秀!