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



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

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

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

期望结果:

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

使用regexp处理HTML很难(实际上是不可能的,但让我们假设您想要的有限子集是可能的(。您需要:

  • 不合理匹配
  • 向前看和向后看,所以你跳过了左大括号后面的前斜杠,还没有结束斜杠

看看这个例子

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

也许它有点复杂,但如果你使用PHP,你可以尝试这个正则表达式。它也适用于嵌套/成对的标记。

  • Regex
(?:(<(S+)[^<>]*>(?:[^<>]|(?1))*</2>)|<[^<>]*>)(*SKIP)(*F)|/
  • 替换
/INSERT

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

检查测试用例。

最新更新