Is there a good way of test if a string is a regex or normal string in PHP?
Ideally I want to write a function to run a string through, that returns true or false.
I had a look at preg_last_error()
:
<?php preg_match('/[a-z]/', 'test'); var_dump(preg_last_error()); preg_match('invalid regex', 'test'); var_dump(preg_last_error()); ?>
Where obviously first one is not an error, and second one is. But preg_last_error()
returns int 0
both times.
Any ideas?
You can't detect regular expressions with a regular expression, as regular expressions themselves are not a regular language. However, the easiest you probably could do is trying to compile a regex from your textbox contents and when it succeeds you know that it's a regex. If it fails, you know it's not.
You can use the test construct, [[ ]] , along with the regular expression match operator, =~ , to check if a string matches a regex pattern (documentation). where commands after && are executed if the test is successful, and commands after || are executed if the test is unsuccessful.
Variant 1: String matches() This method tells whether or not this string matches the given regular expression. An invocation of this method of the form str. matches(regex) yields exactly the same result as the expression Pattern. matches(regex, str).
The simplest way to test if a string is a regex is:
if( preg_match("/^\/.+\/[a-z]*$/i",$regex))
This will tell you if a string has a good chance of being intended to be as a regex. However there are many string that would pass that check but fail being a regex. Unescaped slashes in the middle, unknown modifiers at the end, mismatched parentheses etc. could all cause problems.
The reason preg_last_error
returned 0 is because the "invalid regex" is not:
Here is a good answer how to:
https://stackoverflow.com/a/12941133/2519073
if(@preg_match($yourPattern, null) === false){ //pattern is broken }else{ //pattern is real }
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