Php 正则表达式断言扩展行为

Php 正则表达式断言扩展行为,php,regex,assertion,Php,Regex,Assertion,我在PHP中使用正则表达式来消除文本行中的斜体html孤立标签(如果标签成对,则保持文本不变),并使用正则表达式断言,我成功地做到了这一点,因为我希望消除同一行中后面没有的斜体html孤立标签,使用以下句子: $buffer = preg_replace('/(.*)<i>(?!.*<\/i>)(.*)/', "$1$2$3", $buffer); $buffer=preg_replace(“/(.*)(?!.*)(.*)/”、“$1$2$3”、$b

我在PHP中使用正则表达式来消除文本行中的斜体html孤立标签(如果标签成对,则保持文本不变),并使用正则表达式断言,我成功地做到了这一点,因为我希望消除同一行中后面没有的斜体html孤立标签,使用以下句子:

$buffer = preg_replace('/(.*)<i>(?!.*<\/i>)(.*)/', "$1$2$3", $buffer);
$buffer=preg_replace(“/(.*)(?!.*)(.*)/”、“$1$2$3”、$buffer);
但是,当我尝试对同一行中前面没有的标签执行相同操作时,使用:

$buffer = preg_replace('/(.*)(?<!<i>.*)<\/i>(.*)/', "$1$2$3", $buffer);
$buffer=preg_replace(“/(.*)(?.*)(.*)/”、“$1$2$3”、$buffer);
它返回null(我认为这意味着语法错误)。我知道问题出在“?”之后的“*”,因为如果我使用:

$buffer = preg_replace('/(.*)(?<!<i>.)<\/i>(.*)/', "$1$2$3", $buffer);
$buffer=preg_replace(“/(.*)(?)(.*)/”、“$1$2$3”、$buffer);
我使用一个只有一个字符介于和之间的字符串进行测试(如“TEST1WORKS”),它运行正常,但当然,这没有什么用处,因为我不知道操作中有多少字符介于和之间。我假设第一个命令的负前瞻断言应该比第二个命令的负前瞻断言具有对称行为,但情况似乎并非如此

有人能告诉我如何规避这个问题吗


感谢大家的问候。

:不要使用正则表达式解析HTML,而是使用实际的DOM解析器,如php HTML解析器或simplehtmldom等。断言在这里没有用处。您通常会使用一种替代方法来忽略案例。嗯,要解析的文本不是HTML。我用了“\”和“\”,但我本可以用“开始”和“结束”。我只使用这两个标签来划分斜体样式。然后我认为(*SKIP)和(*FAIL)在我的环境中不可用。根据:“lookback断言的内容受到限制,因此它匹配的所有字符串都必须具有固定长度。”由于您的模式没有固定长度,这种方法无法工作。您可能需要迭代字符串并查找匹配的符号对,或者如果它们可能是嵌套的,则将其解析为符号堆栈并查找不匹配的情况?谢谢您Don R。这正是我需要的参考