GROVER.
GROVER.

Reputation: 4378

remove leading and trailing break tags from string

I have developed a simple PHP feed system which displays all of the logged in users posts. It works fine, however, I have come across a "bug" where if the user has made a status which contains leading and/or trailing <br> points, it'll break the status view.

Now, before anyone marks this as a duplicate; If have tried the following approaches (and two more from posts which I can no longer find) in removing the trailing and leading <br>'s:

  1. Remove <br>'s from the end of a string

  2. How to trim all leading/trailing
    code using php

However, they a) do nothing at all, or b) do work, but remove all the <br> points within the string, even if they are in the middle.

Attempts:

$ctx = preg_replace('/^(<br>){0,}|(<br>){0,}$/m', '', nl2br(escape($post->ctx)));

$ctx = preg_replace('/(<br>)+$/', '', nl2br(escape($post->ctx)));

$ctx = preg_replace('#(( ){0,}<br( {0,})(/{0,1})>){1,}$#i', '', nl2br(escape($post->ctx)));

I have been working on this for a little while now, but have come up with no proper fix. I have come close with attempt c, however, it would remove all <br> points.

All help is appreciated,
Thanks!

Upvotes: 1

Views: 522

Answers (2)

Dmitry Egorov
Dmitry Egorov

Reputation: 9650

Try to replace with contents optionally wrapped by the <br />'s (note that nl2br inserts <br />):

^(?:<br />[\n\r]+)*(.*?)(?:<br />[\n\r]+)*$

Demo: https://regex101.com/r/7KDCuA/3

And the PHP code:

$input = "\nHello World\nhello world\n\n";
$unwrapped = preg_replace("|^(?:<br />[\n\r]+)*(.*?)(?:<br />[\n\r]+)*$|s", '$1', nl2br($input));
echo $unwrapped;

Demo: http://codepad.org/BT0A5583

Upvotes: 2

radicarl
radicarl

Reputation: 327

sounds to me like this should already help:

nl2br(escape(trim($post->ctx)));

This will work, if the users aren't allowed to enter html for their status. The trim will remove all whitespaces at the beginning and the end of the string and so the string passed to nl2br has no line breaks at the beginning and at the end.

Upvotes: 2

Related Questions