在每个单词

时间:2015-08-07 12:34:55

标签: php regex string preg-match

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

[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-replace来规范化数据。每个分隔符必须有前导和尾随换行符,第一个分隔符必须只有尾随换行符:

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

我尝试过这种查找替换模式(regexr),但它并不适用于所有情况:

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

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

2 个答案:

答案 0 :(得分:2)

正则表达式

\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

答案 1 :(得分:1)

这应该适合你:

首先只需使用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);

?>