0

If I have a string like this:

blah
test



asdf

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?

2
Contributors
1
Reply
2
Views
10 Years
Discussion Span
Last Post by urolicious
0

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

eg:

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)) {
            $nls++;
        } else {
            $nls = 0;
        }
        if ($nls < $max) {
            $str .=  $rep;
        }
    }
    return substr($str, 0, strlen($str) - strlen($rep));
}

Usage:

echo my_nl2br2($str);

I haven't tested it though...

This topic has been dead for over six months. Start a new discussion instead.
Have something to contribute to this discussion? Please be thoughtful, detailed and courteous, and be sure to adhere to our posting rules.