在一个非常大的字符串中我必须删除[w:r] [/ w:r],其中存在子字符串“delete”。 示例-of我要删除的子字符串 - :
[w:r w:rsidR="00A37EED" w:rsidRPr="00FE1BE1"][w:rPr][w:b][/w:rPr][w:t]delete[/w:t][/w:r]
这是我最好的猜测\[w:r.*delete.*\[\/w:r\]
我尝试了多个正则表达式,但这不是我的强项。
我在regex101上复制粘贴字符串,这是链接https://regex101.com/r/wS4bL2/1
我成功地找到了所需的模式,但我无法在[/w:r]
的第一次出现时停止。
PHP代码 - 如果您想知道 - :
$this->tempDocumentMainPart = preg_replace('/\[w:r.*delete.*\[\/w:r\]/','',$this->tempDocumentMainPart);
答案 0 :(得分:2)
.*
将溢出[....]
。一种方法是使用tempered greedy token:
\[w:r\b(?:(?!\[w:r\b).)*?delete(?:(?!\[w:r\b).)*?\[\/w:r]
^^^^^^^^^^^^^^^^^ ^^^^^^^^^^^^^^^^^
请参阅regex demo
(?:(?!\[w:r\b).)*?
淬火贪婪令牌将限制一个[w:r
内部的匹配(右边有一个单词边界)。
添加DOTALL修饰符/s
('/PATTERN/s'
)以匹配换行符。