PHP/Regex:获取星星之间的内容,但如果有反斜杠,则不会

Max*_*Net 2 php regex

我想得到两颗星之间的所有东西 - 除了它们有一个领先的反斜杠.

例如:

*hello* world
Run Code Online (Sandbox Code Playgroud)

应该返回"你好",但是

*hello \* world*
Run Code Online (Sandbox Code Playgroud)

应该回归"你好*世界"

我尝试了以下正则表达式:

/(?<!\\)\*(.+?)(?<!\\)\*/s
Run Code Online (Sandbox Code Playgroud)

这在http://regex101.com/上运行完美,但php返回:

警告:偏移21处的preg_replace():编译失败:丢失)

我究竟做错了什么?

-

编辑1:这是我的PHP代码:

var_dump(preg_replace('/(?<!\\)\*(.+?)(?<!\\)\*/s', '<strong>$1</strong>', '*hello world*'));
Run Code Online (Sandbox Code Playgroud)

Vla*_*acu 5

您没有正确地转义反斜杠,导致转义)角色.

要\在PHP中匹配,您需要4个反斜杠

/(?<!\\\\)\*(.+?)(?<!\\\\)\*/s
Run Code Online (Sandbox Code Playgroud)

必须这样做,因为类似C的字符串中的每个反斜杠都必须通过反斜杠进行转义.这将为我们提供一个带有2个反斜杠的正则表达式,正如您最初可能假设的那样.但是,正则表达式中的每个反斜杠也必须通过反斜杠进行转义.这就是我们最终得到4个反斜杠的原因.

或者使用带有2个反斜杠的字符类

/(?<![\\])\*(.+?)(?<![\\])\*/s
Run Code Online (Sandbox Code Playgroud)

也可以使用preg_match()通过使用字符类来匹配文字反斜杠.当反斜杠出现在正则表达式的字符类中时,它们不会被转义.因此("[\]")将匹配文字反斜杠.反斜杠仍然必须通过另一个反斜杠转义一次,因为它仍然是一个类似C的字符串.

编辑发现这篇文章解释了为什么这是必要的.另外,补充说明.