Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Parse block with php regex

Tags:

regex

php

block

I'm trying to write a (I think) pretty simple RegEx with PHP but it's not working. Basically I have a block defined like this:

%%%%blockname%%%%
stuff goes here
%%%%/blockname%%%%

I'm not any good at RegEx, but this is what I tried:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/i',$input,$matches);

It returns an array with 4 empty entries.

I guess it also, apart from actually working, needs some sort of pointer for the third match because it should be equal to the first one?

Please enlighten me :)

like image 775
Kokos Avatar asked Jan 28 '26 12:01

Kokos


1 Answers

You need to allow the dot to match newlines, and to allow ^ and $ to match at the start and end of lines (not just the entire string):

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/(.*?)%%%%$/sm',$input,$matches);

The s (single-line) option makes the dot match any character including newlines.

The m (multi-line) option allows ^ and $ to match at the start and end of lines.

The i option is unnecessary in your regex since there are no case-sensitive characters in it.

Then, to answer the second part of your question: If blockname is the same in both cases, then you can make that explicit by using a backreference to the first capturing group:

preg_match_all('/^%%%%(.*?)%%%%(.*?)%%%%\/\1%%%%$/sm',$input,$matches);
like image 143
Tim Pietzcker Avatar answered Jan 30 '26 01:01

Tim Pietzcker



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!