<?php
$pattern = '#(?<!\\\\)\\.#';
$pattern = '#(?<!\\\\)((?:\\\\\\\\)*)\\.#';
//$pattern = '#((?<!\\\\)|(?<=\\\\\\\\)*)\\.#';
$tests = ['bar.baz', 'bar\\.baz', 'bar\\\\.baz', 'bar\\\\\\.baz', 'bar\\\\\\\\.baz'];
var_dump($pattern);
$results = [];
foreach ($tests as $path) {
$split = preg_split($pattern, $path, -1, PREG_SPLIT_NO_EMPTY|PREG_SPLIT_DELIM_CAPTURE);
$split = array_reduce(
$split,
static function ($result, $value) {
$lastIndex = count($result) - 1;
if ($lastIndex >= 0 && preg_match('#^\\\\*$#', $value)) {
$result[$lastIndex] = $result[$lastIndex] . $value;
} else {
$result[] = $value;
}
return $result;
},
[]
);
$unescaped = array_map(
static function ($value) {
return str_replace(['\\\\','\\.'], ['\\','.'], $value);
},
$split
);
$results[$path] = [$split, $unescaped];
}
var_dump($results);
- Output for 7.2.0 - 7.2.33, 7.3.0 - 7.3.33, 7.4.0 - 7.4.33, 8.0.0 - 8.0.30, 8.1.0 - 8.1.28, 8.2.0 - 8.2.19, 8.3.0 - 8.3.4, 8.3.6 - 8.3.7
- string(22) "#(?<!\\)((?:\\\\)*)\.#"
array(5) {
["bar.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
}
}
["bar\.baz"]=>
array(2) {
[0]=>
array(1) {
[0]=>
string(8) "bar\.baz"
}
[1]=>
array(1) {
[0]=>
string(7) "bar.baz"
}
}
["bar\\.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(5) "bar\\"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(4) "bar\"
[1]=>
string(3) "baz"
}
}
["bar\\\.baz"]=>
array(2) {
[0]=>
array(1) {
[0]=>
string(10) "bar\\\.baz"
}
[1]=>
array(1) {
[0]=>
string(8) "bar\.baz"
}
}
["bar\\\\.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(7) "bar\\\\"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(5) "bar\\"
[1]=>
string(3) "baz"
}
}
}
- Output for 8.3.5
- Warning: PHP Startup: Unable to load dynamic library 'sodium.so' (tried: /usr/lib/php/8.3.5/modules/sodium.so (libsodium.so.23: cannot open shared object file: No such file or directory), /usr/lib/php/8.3.5/modules/sodium.so.so (/usr/lib/php/8.3.5/modules/sodium.so.so: cannot open shared object file: No such file or directory)) in Unknown on line 0
string(22) "#(?<!\\)((?:\\\\)*)\.#"
array(5) {
["bar.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(3) "bar"
[1]=>
string(3) "baz"
}
}
["bar\.baz"]=>
array(2) {
[0]=>
array(1) {
[0]=>
string(8) "bar\.baz"
}
[1]=>
array(1) {
[0]=>
string(7) "bar.baz"
}
}
["bar\\.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(5) "bar\\"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(4) "bar\"
[1]=>
string(3) "baz"
}
}
["bar\\\.baz"]=>
array(2) {
[0]=>
array(1) {
[0]=>
string(10) "bar\\\.baz"
}
[1]=>
array(1) {
[0]=>
string(8) "bar\.baz"
}
}
["bar\\\\.baz"]=>
array(2) {
[0]=>
array(2) {
[0]=>
string(7) "bar\\\\"
[1]=>
string(3) "baz"
}
[1]=>
array(2) {
[0]=>
string(5) "bar\\"
[1]=>
string(3) "baz"
}
}
}
preferences:
119.21 ms | 404 KiB | 178 Q