给定一个包含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
这个想法是先匹配所有标签,然后忽略它们,然后可以安全地匹配/
。
检查测试用例。