What would be a regex (PHP) to replace/remove (using preg_replace()
) END where its not been preceded by an unended START?
Here are a few examples to portray what I mean better:
Example 1:
Input:
sometext....END
Output:
sometext.... //because theres no START, therefore no need for the excess END
Example 2:
Input:
STARTsometext....END
Output:
STARTsometext....END //because its preceded by a START
Example 3:
Input:
STARTsometext....END.......END
Output:
STARTsometext....END....... //because the END is not preceded by a START
Hoping someone can help?
Thank You.
Assuming you aren't looking for nested pairs, there is a simple solution to remore excess ENDs. Consider:
$str = preg_replace("/END|(START.*?END)/", "$1", $str);
This is a little backwards replacement, but it makes sense if you understand the order in which the engine works. First, the regex is made of two main parts: END|()
. The alternations are tried from left to right, so if the engine sees an END
in the input string, it will match it and move on to the next match (that is, look for END
again).
The second part is a capturing group, which contains START.*?END
- this will match an entire Start/End token if possible. Everything else will be skipped, until it finds another END or START.
Since we use $1
in the replace, which is the captured group, we only save the second token. Therefor, the only way for an END
to survive is to get into the capturing group, by being the first one after a START
.
For example, for the text END START 123 END abc END
. The regex will find the following matches, and keep, skip or remove them accordingly:
END
- Removed(START 123 END)
- Captureda
- Skipb
- Skipc
- SkipEND
- RemovedWorking example: http://ideone.com/suVYh
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With