PHP Regex “Unknown modifier p” [duplicate]

2020-01-29 20:51发布

问题:

Regex PHP Code

// If url matches regex
            $regex = "/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/";
        if (preg_match($regex, $this->value)) {

            $this->valid();
        }

Error Message

Warning: preg_match() [<a href='function.preg-match'>function.preg-match</a>]: Unknown modifier 'p' in C:\Apache\www\profiletwist\lib\php\form\url.php on line 41
Call Stack
#   Time    Memory  Function    Location
1   0.0079  440016  {main}( )   ..\new.php:0
2   0.0964  667832  form->validate( )   ..\new.php:60
3   0.0968  668248  form_URL->validateUploadURL( )  ..\form.php:372
4   0.0969  668400  preg_match ( )  ..\url.php:41
Variables in local scope (#3)

$regex =



string '/^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$/' (length=79)

Question

How do I fix the regex for this "unknown modifier" error to not occur?

ultimately, I would like a regex that makes sure the text input matches:

"/upload/temporary/####_##_##_[A-z0-9 _-]+ "." [a-z]{3}

This is a filename target. The beginning does not change and the last part can be a random hash followed by an arbitrary extension. Further processing is done after the regex but this is the first test.

Thank you!

回答1:

In a regex string you have to escape your delimiters. Or better: use a character which doesn't appear in the regex itself as delimiter:

other delimiter (recommended):

$regex = "#^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$#";

escaped delimiters:

$regex = "/^(\/upload\/temporary\/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ \/-]+.[A-z]{2,4}$/";


回答2:

You need to escape the front slashes or just use another delimiter (I've used ! in this case):

$regex = "!^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[A-Za-z0-9._ /-]+.[A-z]{2,4}$!"


回答3:

$regex = "~^(/upload/temporary/)[0-9]{4}_[0-9]{2}_[0-9]{2}_[\w./-]+\.[a-z]{2,4}$~";

Change your delimiters to ~

When you use a delimiter for example /, you must escape all litteral / in your pattern otherwhise the regex engine believes that it is the end of the pattern.

Since u is a modifier and p isn't a modifier, you have this error because of the substring /^(/up....