我需要将降价URL转换为<a href="" />
链接。但是,使用PHP的同一个正则表达式不能使用JavaScript。我做错了什么?
正则表达式:\[([^]]*)\]\(([^\s^\)]*)[\s\)]
这是您可以自己查看的演示链接:
https://regex101.com/r/kZbw7g/5
插入符号在JavaScript中似乎具有不同的含义。
任何帮助表示赞赏。
最佳答案
看这个
\[
( [^]]* ) # (1)
\]
\(
( [^\s^\)]* ) # (2)
[\s\)]
这是您的正则表达式的可读格式版本。
有一些规则可以控制字符类的解析(非Java / DotNet)。
该类将打开
[
且不会转义。规则#1:下一个未转义的
]
关闭类。唯一的例外是当它是类中的第一项时。
[]]
。此异常也适用于否定类
[^]]
,因为它仍然是课程中的第一项。
这就是为什么您的正则表达式可以在pcre演示中使用的原因。
但是,JS仍然是过时的引擎,对于
]
没有这种宽限期是第一项。
因此,必须将其转义。
[\]]
和[^\]]
在此处查看JS版本https://regex101.com/r/kZbw7g/6
附录:
此外,您可以查看未转义的宽限期如何/为什么存在
]
当它是第一项时。最初,在设计用于类解析的规则时,
确定不允许EMPTY类
[]
。修复状态可能超出了设计师想要的状态
处理。换句话说,他们希望将解析类设置得非常低
聪明的事情。
谁知道为什么
这是踢人,不允许空课。
如果
]
紧接在课程开始后(第一项),它不可能是结尾
]
,因为那是非法的空类。
但是,由于存在有效的右括号
[]]
,因此没有歧义,第一项
]
是文字。这样,“第一项例外”就诞生了。
这是证明:
pcre https://regex101.com/r/v0uBHA/1
JS https://regex101.com/r/foqcpL/1
Python https://regex101.com/r/sko0Qv/1
去https://regex101.com/r/Nhx8Ks/1