PHP /正则表达式:获取星号之间的内容,但如果存在反斜杠,则不会 - php

我想让所有事物都介于两颗星之间-除了它们之间有一个反斜杠。

因此,例如:

*hello* world

应该返回“ hello”,但是

*hello \* world*

应该返回“ hello * world”

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

/(?<!\\)\*(.+?)(?<!\\)\*/s

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

警告:preg_replace():编译失败:缺少)在偏移量21处

我究竟做错了什么?

-

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

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

参考方案

您没有正确转义反斜杠,这会导致转义)字符。

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

/(?<!\\\\)\*(.+?)(?<!\\\\)\*/s

必须这样做,因为类似C的字符串中的每个反斜杠
必须以反斜杠转义。那会让我们有规律
如您最初所假设的那样,带有2个反斜杠的表达式。
但是,正则表达式中的每个反斜杠必须以
反斜杠也一样。这就是我们以4个反斜杠结尾的原因。

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

/(?<![\\])\*(.+?)(?<![\\])\*/s

文字反斜杠也可以使用preg_match()进行匹配,方法是使用
角色类代替。反斜杠出现时不会转义
在正则表达式的字符类中。因此(“ [\]”)
将匹配文字反斜杠。反斜杠仍必须转义
一次反斜杠,因为它仍然是一个类似于C的字符串。

编辑找到的this article,它解释了为什么这样做是必要的。此外,还添加了解释。

正则表达式:字母后不能再有另一个字母 - php

It's difficult to tell what is being asked here. This question is ambiguous, vague, incomplete, overly broad, or rhetorical and cannot be reasonably answered in its current fo…

PHP-将日期插入日期时间字段 - php

我已在数据库中使用datetime字段存储日期,使用PHP将“今天的日期”插入该字段的正确方法是什么?干杯, 参考方案 我认为您可以使用php date()函数

PHP-如何获取类的成员函数列表? - php

如果我知道班级的名字。有没有办法知道类的成员函数列表? 参考方案 get_class_methods()是你的朋友

php Singleton类实例将在多个会话中保留吗? - php

举一个简单的例子,如果我想计算一个不使用磁盘存储的脚本的命中次数,我可以使用静态类成员来执行此操作吗?用户1:<?php $test = Example::singleton(); $test->visits++; ?> 用户2:<?php $test = Example::singleton(); $test->visits+…

php ziparchive类源代码 - php

Improve this question 我如何获取ziparchive类本身的源代码。 参考方案 假设您在谈论PHP ZipArchive class:下载PHP source code并查找适当的文件。如果您希望源代码是PHP代码,您可能会感到失望,因为源代码是用C语言编写的。或者,也可以在PHP Github Development Reposito…