3

I've checked other answers but can't seem to do the following. Please help someone :)

I want to remove everything in between and including specific html comments

HTML:

Some HTML that must stay
<!-- START IF USER_ID -->
some html that must go
<!-- END IF USER_ID -->
Some more HTML that's gotta stay
<!-- START IF USER_ID -->
this also needs to go
<!-- END IF USER_ID -->

So everything in between <!-- START IF USER_ID --> and <!-- END IF USER_ID --> and the comments itself needs to go

My preg_replace pattern (which is obviously wrong):

"/<!-- START IF USER_ID -->.*?<!-- END IF USER_ID -->/"

Result should be

Some HTML that must stay
Some more HTML that's gotta stay

Thanks for checking and for the answers in advance :)

Onimusha
  • 3,191
  • 2
  • 23
  • 31

2 Answers2

8

Thanks @mlwacosmos - Using the link you provided.

Achieved with:

$startPoint = '<!-- START IF USER_ID -->';
$endPoint = '<!-- END IF USER_ID -->';
$result = preg_replace('#('.preg_quote($startPoint).')(.*)('.preg_quote($endPoint).')#siU', '', $html);
Onimusha
  • 3,191
  • 2
  • 23
  • 31
  • 1
    How to do this but stop at the first $endpoint ? If you have xxx $start yyy $end zzz $end. I dont wanna delete the zzz because there is an enpoint before. – neoteknic Jul 12 '17 at 09:00
  • Thanks @neoteknic never realised this. Answer modified to include non-greedy modifier `U` which stops at the first one then continues onwards. – Onimusha Jan 25 '18 at 16:19
3

That regex looks fine. Use an m modifier to make the dot match newlines:

"/<!-- START IF USER_ID -->.*?<!-- END IF USER_ID -->/m"

Alternatively, you could use [\s\S] as a substitute:

"/<!-- START IF USER_ID -->[\s\S]*?<!-- END IF USER_ID -->/"
Asad Saeeduddin
  • 43,250
  • 5
  • 81
  • 127