Skip to content
This repository was archived by the owner on Aug 22, 2023. It is now read-only.

Commit 4bb2b24

Browse files
committed
Unescape forward slash from regex
1 parent 491e96d commit 4bb2b24

File tree

2 files changed

+7
-2
lines changed

2 files changed

+7
-2
lines changed

src/Query/Builder.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1052,6 +1052,7 @@ protected function compileWhereBasic(array $where): array
10521052
if (in_array($operator, ['regex', 'not regex'])) {
10531053
// Automatically convert regular expression strings to Regex objects.
10541054
if (is_string($value)) {
1055+
// Detect the delimiter and validate the preg pattern
10551056
$delimiter = substr($value, 0, 1);
10561057
if (! in_array($delimiter, self::REGEX_DELIMITERS)) {
10571058
throw new \LogicException(sprintf('Missing expected starting delimiter in regular expression "%s", supported delimiters are: %s', $value, implode(' ', self::REGEX_DELIMITERS)));
@@ -1060,8 +1061,12 @@ protected function compileWhereBasic(array $where): array
10601061
if (count($e) < 3) {
10611062
throw new \LogicException(sprintf('Missing expected ending delimiter "%s" in regular expression "%s"', $delimiter, $value));
10621063
}
1064+
// Flags are after the last delimiter
10631065
$flags = end($e);
1066+
// Extract the regex string between the delimiters
10641067
$regstr = substr($value, 1, -1 - strlen($flags));
1068+
// Unescape forward slashes
1069+
$regstr = stripslashes($regstr);
10651070
$value = new Regex($regstr, $flags);
10661071
}
10671072

tests/Query/BuilderTest.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -635,8 +635,8 @@ function (Builder $builder) {
635635
fn (Builder $builder) => $builder->where('name', 'regex', '#^acme$#si'),
636636
];
637637

638-
yield 'where regex escaped delimiter' => [
639-
['find' => [['name' => new Regex('ac\/me', '')], []]],
638+
yield 'where regex with escaped forward slash' => [
639+
['find' => [['name' => new Regex('ac/me', '')], []]],
640640
fn (Builder $builder) => $builder->where('name', 'regex', '/ac\/me/'),
641641
];
642642

0 commit comments

Comments
 (0)