繁体   English   中英

如果它不在锚点/链接标签内,则正则表达式替换正斜杠

[英]Regex to replace forward slash if it isn't within an anchor/link tag

给定一个包含诸如some/text <a href="/some/text">some/text</a>之类的序列的字符串,我只需要替换不在链接中的斜杠(在斜杠之后插入)。

请注意,字符串中会有上述的多个实例,它只是目标的正斜杠。

作为起点,我尝试使用/(\w)(\/{1})(\w)/替换$1$2INSERT$3 ,但这会替换链接中的斜杠。 我不确定如何使它不在<a*></a>内。

期望的结果:

some/INSERTtext <a href="/some/text">some/text</a>

用正则表达式处理 HTML 很难(实际上是不可能的,但让我们假设您想要的有限子集是可能的)。 你需要:

  • 不贪心匹配
  • 向前看和向后看,所以你跳过左大括号后面的正斜杠,还没有关闭一个

以这个为例

但更好的方法是不使用 RegExp 来完成此任务,而是将其加载到 DOMDOcument 中并仅在文本节点中实际运行替换,遍历树,替换文本节点中的正斜杠,并返回生成的 HTML

也许这有点令人费解,但如果您使用的是 PHP,我可以试试这个正则表达式。 它也适用于嵌套/配对标签。

  • 正则表达式
(?:(<(\S+)[^<>]*>(?:[^<>]|(?1))*<\/\2>)|<[^<>]*>)(*SKIP)(*F)|\/
  • 替代
/INSERT

这个想法是首先匹配所有标签然后忽略它们,然后你可以匹配/安全。

检查测试用例

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM