在每个单词后面最多插入一个换行符


Insert at most one leading and trailing newline after each word

我有包含分隔符的字符串。分隔符需要包含前导换行符和尾随换行符,但它们不需要。三个例子:

[heading 1]content[heading 2]content[heading 3]content
[heading 1]content↵
[heading 2]content↵
[heading 3]content
[heading 1]↵
content[heading 2]↵
content[heading 3]↵
content

我需要使用正则表达式find-replaces来规范化数据。每个分隔符必须有前导和尾随换行符,第一个分隔符必须只有尾随换行符:

[heading 1]↵
content↵
[heading 2]↵
content↵
[heading 3]↵
content

我尝试过这种查找替换模式(regexr(,但它并不能在所有情况下都起作用:

find: '[.+?'](?!'r'n)
repl: $0'r'n

更新:我更喜欢只使用一个正则表达式的解决方案,它不需要预处理和后处理,如替换和修剪。

正则表达式

's*('[[^[']]+])'s*

在标题'[[^[']]+]之前和之后搜索分隔符's*并移除它们。将捕获的标题前后各有一个换行符作为"'n'1'n"输出。

可用于

$input="[heading 1]content[heading 2]content[heading 3]content
[heading 1]content
[heading 2]content
[heading 3]content
[heading 1]
content[heading 2]
content[heading 3]
content";
$str=substr(preg_replace(''s*('[[^[']]+])'s*',"'n'1'n",$input),1);

生产以下产品:

[heading 1]
content
[heading 2]
content
[heading 3]
content
[heading 1]
content
[heading 2]
content
[heading 3]
content
[heading 1]
content
[heading 2]
content
[heading 3]
content

这应该适用于您:

首先,只需将所有新行替换为str_replace(),然后您就可以轻松地在每个[heading]之后添加新行,并将content添加为preg_replace(),例如

<?php
    $str = "[heading 1]content[heading 2]content[heading 3]content";
    $str = trim(preg_replace("/('[.+?'])((?:[^'[])+)/", "$1" . PHP_EOL . "$2" . PHP_EOL, str_replace(PHP_EOL, "", $str)));
    highlight_string($str);
?>

输出:

[heading 1]
content
[heading 2]
content
[heading 3]
content

编辑:

如果你只想使用正则表达式,你可以这样做:

<?php
    $str = "[heading 1]content[heading 2]content[heading 3]content
[heading 1]content
[heading 2]content
[heading 3]content
[heading 1]
content[heading 2]
content[heading 3]
content";
    $str = preg_replace("/'s*('[.+?']|(?![^'[]+$(*PRUNE))[^'[]+)'s*/", "$1" . PHP_EOL, $str);
    var_dump($str);
?>