aboutsummaryrefslogtreecommitdiffhomepage
path: root/crates/shirabe-php-shim/src/preg.rs
diff options
context:
space:
mode:
authornsfisis <nsfisis@gmail.com>2026-06-14 16:39:38 +0900
committernsfisis <nsfisis@gmail.com>2026-06-14 22:19:30 +0900
commit7f3171b14a89762b2f0c71969d7243f2297af7c9 (patch)
tree37253f75e4f3b1c0e8a3c4161f7186bbe2c1a2d7 /crates/shirabe-php-shim/src/preg.rs
parentae113f91fefff415898781272b892d670fcb46f4 (diff)
downloadphp-shirabe-7f3171b14a89762b2f0c71969d7243f2297af7c9.tar.gz
php-shirabe-7f3171b14a89762b2f0c71969d7243f2297af7c9.tar.zst
php-shirabe-7f3171b14a89762b2f0c71969d7243f2297af7c9.zip
feat(php-shim): implement more shim functions
Diffstat (limited to 'crates/shirabe-php-shim/src/preg.rs')
-rw-r--r--crates/shirabe-php-shim/src/preg.rs15
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()