Warning: preg_replace(): Unknown modifier
Why the error occurs
In PHP, a regular expression needs to be enclosed within a pair of delimiters. A delimiter can be any non-alphanumeric, non-backslash, non-whitespace character; /
, #
, ~
are the most commonly used ones. Note that it is also possible to use bracket style delimiters where the opening and closing brackets are the starting and ending delimiter, i.e. <pattern_goes_here>
, [pattern_goes_here]
etc. are all valid.
The "Unknown modifier X" error usually occurs in the following two cases:
When your regular expression is missing delimiters.
When you use the delimiter inside the pattern without escaping it.
In this case, the regular expression is <div[^>]*><ul[^>]*>
. The regex engine considers everything from <
to >
as the regex pattern, and everything afterwards as modifiers.
Regex: <div[^> ]*><ul[^>]*>
│ │ │ │
└──┬──┘ └────┬─────┘
pattern modifiers
]
here is an unknown modifier, because it appears after the closing >
delimiter. Which is why PHP throws that error.
Depending on the pattern, the unknown modifier complaint might as well have been about *
, +
, p
, /
or )
or almost any other letter/symbol. Only imsxeADSUXJu
are valid PCRE modifiers.
How to fix it
The fix is easy. Just wrap your regex pattern with any valid delimiters. In this case, you could chose ~ and get the following:
~<div[^>]*><ul[^>]*>~
│ │
│ └─ ending delimiter
└───────────────────── starting delimiter
If you're receiving this error despite having used a delimiter, it might be because the pattern itself contains unescaped occurrences of the said delimiter.
Or escape delimiters
/foo[^/]+bar/i
would certainly throw an error. So you can escape it using a \ backslash if it appears anywhere within the regex:
/foo[^\/]+bar/i
│ │ │
└──────┼─────┴─ actual delimiters
└─────── escaped slash(/) character
This is a tedious job if your regex pattern contains so many occurrences of the delimiter character.
The cleaner way, of course, would be to use a different delimiter altogether. Ideally a character that does not appear anywhere inside the regex pattern, say #
- #foo[^/]+bar#i
.
More reading:
- PHP regex delimiters
- http://www.regular-expressions.info/php.html
- How can I convert ereg expressions to preg in PHP? (missing delimiters)
- Unknown modifier '/' in …? what is it? (on using
preg_quote()
)
preg_replace(): Unknown modifier '\\'
preg_replace(): Unknown modifier
occurs when $test
contains a /
.
preg_quote( $test );
should be
preg_quote( $test, '/' );
/
is the PCRE delimiter used in your '/(^|\W)...(\W|$)/i'
expression.
PHP PCRE's can have any delimiter, so you have to tell preg_quote()
which delimiter is used.
http://php.net/manual/en/regexp.reference.delimiters.php
PHP preg_replace unknown modifier
Simply change your Regex delimiter to something that's not used in the pattern, in this example I used @
which works fine.
preg_quote
only escapes . \ + * ? [ ^ ] $ ( ) { } = ! < > | : -
, so when using a non-escaped character in your pattern, but also as your regex delimiter, it's not going to work as expected. Either change the delimiter as above, or pass it into preg_quote
explicitely as part of the preg_quote($str, $delimiter)
overload.
$content = "{youtube}omg{/youtube}";
$find = array();
$replace = array();
$find[] = '{youtube((?!}).)*}';
$replace[] = '[embed]http://www.youtube.com/watch?v=';
$find[] = '{/youtube((?!}).)*}';
$replace[] = '[/embed]';
foreach ( $find as $key => $value ) {
$find[$key] = '@' . preg_quote($value) . '@';
}
echo preg_replace($find, $replace, $content);
Related Topics
Sending Message in Telegram Bot With Images
Reading Numbers as Text Format With Phpexcel
How to Add Dynamic Filter Using PHP MySQL Ajax
How to Get Newest Data With 'Created_At' Column
How to Pass a PHP Variable Using the Url
Curl (7): Failed to Connect to Localhost Port 8000: Connection Refused
How to Do File Upload Using Jquery Serialization
Selected Value Get from Db into Dropdown Select Box Option Using PHP MySQL Error
Laravel Eloquent Sum of Multiplied Columns
Dynamic Menu and Role Permission in Codeigniter
How to Find Out If CSV File Fields Are Tab Delimited or Comma Delimited
Add Space After Every 4Th Character
Laravel: Products,Categories and Subcategories! (Relation Ships)
How to Fix Undefined Offset: 0 in Laravel Blade
Calculate Difference Between 2 Times in Hours in PHP