在每个单词后最多插入一个前导和尾随换行符
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
我需要使用正则表达式查找替换来规范化数据。每个定界符必须有前导和尾随换行符,第一个定界符只能有尾随换行符:
[heading 1]↵
content↵
[heading 2]↵
content↵
[heading 3]↵
content
我已经尝试过这种查找替换模式 (regexr),但它并不适用于所有情况:
find: \[.+?\](?!\r\n)
repl: [=12=]\r\n
Update:我更喜欢仅使用一个正则表达式的解决方案,它不需要预处理和 post 处理,例如替换和 trim。
这应该适合你:
首先将所有新行替换为str_replace()
and then you can easily add a new line after each [heading]
and the content
with preg_replace()
,例如
<?php
$str = "[heading 1]content[heading 2]content[heading 3]content";
$str = trim(preg_replace("/(\[.+?\])((?:[^\[])+)/", "" . PHP_EOL . "" . 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*/", "" . PHP_EOL, $str);
var_dump($str);
?>
正则表达式
\s*(\[[^[\]]+])\s*
搜索标题 \[[^[\]]+]
前后的分隔符 \s*
并将其删除。将捕获的标题输出为 "\n\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\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
我有包含分隔符的字符串。分隔符需要包含前导和尾随的换行符,但它们不需要。三个例子:
[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
我需要使用正则表达式查找替换来规范化数据。每个定界符必须有前导和尾随换行符,第一个定界符只能有尾随换行符:
[heading 1]↵
content↵
[heading 2]↵
content↵
[heading 3]↵
content
我已经尝试过这种查找替换模式 (regexr),但它并不适用于所有情况:
find: \[.+?\](?!\r\n)
repl: [=12=]\r\n
Update:我更喜欢仅使用一个正则表达式的解决方案,它不需要预处理和 post 处理,例如替换和 trim。
这应该适合你:
首先将所有新行替换为str_replace()
and then you can easily add a new line after each [heading]
and the content
with preg_replace()
,例如
<?php
$str = "[heading 1]content[heading 2]content[heading 3]content";
$str = trim(preg_replace("/(\[.+?\])((?:[^\[])+)/", "" . PHP_EOL . "" . 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*/", "" . PHP_EOL, $str);
var_dump($str);
?>
正则表达式
\s*(\[[^[\]]+])\s*
搜索标题 \[[^[\]]+]
前后的分隔符 \s*
并将其删除。将捕获的标题输出为 "\n\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\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