If I have a string like this:



What kind of regex would I use to change all single newlines (like between 'blah' and 'test') to <.br> and all multiple newlines (like between 'test' and 'asdf') to a maximum of two <.br>'s?

I've tried these already:

// I had to change br tags to <.br> to make vB not remove them. I don't have a period in the tag in my actual code.

// Replaces each \n with one br tag each, so huge amounts of linebreaks if huge amount of newlines
$text = preg_replace("/(\n)+/m", '<.br>', $text);

// Same result
$text = preg_replace("/(\n)+/mU", '<.br>', $text);

// Puts a <br> after every character in my string (definitely not what I wanted)
$text = preg_replace("/(\n)*/m", '<.br>', $text);

// Inserts no newlines
$text = preg_replace("/\n+$/mU", '<.br>', $text);

I'm out of ideas. Anyone know what else I can try?

You can definately do that with regex, but I believe without would be faster:


function my_nl2br($str, $rep = "<br />", $max = 2) {
    $arr = explode("\r\n", $str);
    $str = '';
    $nls = 0;
    foreach($arr as $line) {
        $str .= $line;
        if (empty($line)) {
        } else {
            $nls = 0;
        if ($nls < $max) {
            $str .=  $rep;
    return substr($str, 0, strlen($str) - strlen($rep));


echo my_nl2br2($str);

I haven't tested it though...