0

Why is that trim() returns i>abc</i instead of <i>abc</i> when using trim($string, "<br />") on the string below?

$string = "  <br />   <br /> <i>abc</i>  <br /> <br />   </br>";

I wanted to remove all <br /> tags from the beginning and end of the string considering that there might be some whitespaces in between <br> tags.

Any suggestions or workarounds?

4
  • 3
    Did you read the documentation for trim? It doesn't trim <br />. It trims <'s then b's, then r's, then spaces, then /'s and finally >'s. Commented Jan 18, 2015 at 17:27
  • Have a look at the function description on the trim manual page. Commented Jan 18, 2015 at 17:27
  • What about strip_tags? Commented Jan 18, 2015 at 17:28
  • I wanted to remove all <br /> tags from the beginning and end of the string, so you don't want to remove the br tags which was present at the middle? Commented Jan 18, 2015 at 17:29

3 Answers 3

2

The second parameter to trim isn't a string as such, more a list of chars you want to strip from the start and end of the string. So, you're telling to strip all leading and trailing <, >, \, b and r characters.

Could try something like this regex to strip what you want from the front and end of a string...

//trim from start
$str=preg_replace('{^(?:<br />|</br>|\s+)+}', '', $str);
//trim from end
$str=preg_replace('{(?:<br />|</br>|\s+)+$}', '', $str);

Just to break down that first one...

  • I've used {} to delimit my regex, just so I don't need to escape the matches on backslashes which I'd have to if I used the 'normal' // delimiter
  • ^ anchors the match to the start of the string
  • (?: ) is just a group of things we want to look for
  • inside the group, we match either <br />, </br> or any whitespace sequence \s+ - you can see each of these patterns is separated by | to indicate each is a possible alternative match
  • the group is followed by + to indicate we want to find one or more matches of that group

The second one is similar, but anchored to the end of the string with $

Sign up to request clarification or add additional context in comments.

5 Comments

This is weird, but true. They should have allowed string or array instead. Sometimes I want to trim a sequence of chars.
@Paul You could combine the both using | operator., and also your regex won't match </br> .
Didn't want to make it too hard to follow - have added in a match for </br> though, well spotted.
typo in your regex (:? instead of (?: . @op note that this regex or mine would match also the spaces which are at the beginning of <space>foo string. If you don't care about that. Then no prob..
Well spotted - funnily enough it still works with the typo, since it turns it into a regular group but with an optional : char at the start! fixed!
0

The second parameter of trim() is a string containing all characters that will be trimmed. Not words or substrings, but characters. It means that < and > will be trimmed too, and this is what happens.

What you need to do is either str_replace the <br /> out before the trim, like str_replace('<br />', '', $string), or do a strip_tags($string, '<i>') that will delete all tags except <i>

Comments

0

I wanted to remove all <br> tags from the beginning and end of the string.

preg_replace('~^(?:\s|<br\h*\/>|<\/br>)+|(?:\s|<br\h*\/>|<\/br>)+$~m', '', $string);

\h* matches zero or more horizontal spaces.

DEMO

1 Comment

@Avanash Raj, if I could upvote you too, I would, since your answer is also right. Anyways thanks for the help! :)

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.