Php 正则表达式Preg替换HTML 请考虑以下段落… {{if|service_name=Service}} Hello this is the Service text {{endif}}

Php 正则表达式Preg替换HTML 请考虑以下段落… {{if|service_name=Service}} Hello this is the Service text {{endif}},php,regex,Php,Regex,这是我允许用户在合同文本中放置自定义条件变量的格式。这意味着,如果服务与“服务”匹配,文本将显示。我通过以下方式实现此替换功能 $text = preg_replace("/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "$1", $text); 这非常有效,直到在合同文本字段上使用CKeditor,并且我的客户机新行被包装在标记中 所以上面的方法是可行的,但这并不是 <p>{{if|service_name=Servic

这是我允许用户在合同文本中放置自定义条件变量的格式。这意味着,如果服务与“服务”匹配,文本将显示。我通过以下方式实现此替换功能

$text = preg_replace("/{{if\|service_name=$service}}\s*(.*?)\R{{endif}}/s", "$1", $text);
这非常有效,直到在合同文本字段上使用CKeditor,并且我的客户机新行被包装在
标记中

所以上面的方法是可行的,但这并不是

<p>{{if|service_name=Service}}</p>

<p>Hello this is the Service text</p>

<p>{{endif}}</p>
{{if|service_name=service}

您好,这是服务文本

{{endif}}

我在这里举了一个例子


有人能解释一下我的问题吗?

那就把它关掉,简单

CKEDITOR.config.autoParagraph = false;

构造
\R
匹配任何换行序列,并且
{endif}
之间没有换行符

您的正则表达式可能会很快修复为

'~{{if\|service_name=Service}}\s*(.*?)\s*{{endif}}~s'
                                      ^^^
\s*
将匹配任意数量的空格(如果字符串中可能有任何Unicode空格,请在
s
之后/之前添加
u
修饰符)


请参阅。

1)使用另一个正则表达式测试仪将多行字符串作为整个字符串进行测试。2) 删除
\R
,因为
{{endif}}
3之间没有换行符,所以不要使用切换贪婪性的
U
修饰符。看到了吗?你期望的结果是什么?请注意,在匹配时不能“跳过”
标记,在提取后,您必须使用一些
stru替换(['','

'],'','$res)
或类似选项(或
剥离标记
)将其删除。@WiktorStribiżew谢谢。是新线把它绊倒了。请添加一个答案,我会接受:-)不,需要各种格式选项的编辑器。你关闭的只是自动段落,而不是所有的格式,试试看至少是的,但他们可能会在这些区域使用各种其他html,无序列表,桌子等。我需要一些更有弹性的东西。谢谢,虽然这应该没问题,但我认为用户并没有真正输入您想要删除的内容,只是由CKEditor生成的HTML,我认为用户添加的任何标记都可以。为什么不试试呢?