diff options
Diffstat (limited to 'crates/shirabe-php-shim/src/preg.rs')
| -rw-r--r-- | crates/shirabe-php-shim/src/preg.rs | 15 |
1 files changed, 12 insertions, 3 deletions
diff --git a/crates/shirabe-php-shim/src/preg.rs b/crates/shirabe-php-shim/src/preg.rs index 1429f1c..46d9428 100644 --- a/crates/shirabe-php-shim/src/preg.rs +++ b/crates/shirabe-php-shim/src/preg.rs @@ -393,12 +393,21 @@ fn compile_php_pattern(pattern: &str) -> anyhow::Result<regex::Regex> { .chars() .next() .ok_or_else(|| anyhow::anyhow!("empty regex pattern"))?; + // PCRE allows bracket-style delimiters whose closing character differs from + // the opening one: `(...)`, `{...}`, `[...]`, `<...>`. + let closing = match delimiter { + '(' => ')', + '{' => '}', + '[' => ']', + '<' => '>', + c => c, + }; let end = pattern - .rfind(delimiter) - .filter(|&i| i > 0) + .rfind(closing) + .filter(|&i| i >= delimiter.len_utf8()) .ok_or_else(|| anyhow::anyhow!("unterminated regex pattern: {pattern}"))?; let inner = &pattern[delimiter.len_utf8()..end]; - let modifiers = &pattern[end + delimiter.len_utf8()..]; + let modifiers = &pattern[end + closing.len_utf8()..]; let flags: String = modifiers .chars() |
