Accommodating Slash with preg_quote - Text Functions (#3582)

PR #3513, developed by @SaidkhojaIftikhor, has been stuck for some time awaiting tests. This is the first of three PRs to replace that one. This accomodates the use of slash as a delimiter in functions TEXTAFTER, TEXTBEFORE, TEXTSPLIT, and NUMBERVALUE. The source changes are very simple. Additional tests exercise all the source changes.
This commit is contained in:
oleibman
2023-05-27 07:16:54 -07:00
committed by GitHub
parent 9a13f526c5
commit 4f6d1f77a3
7 changed files with 37 additions and 5 deletions
@@ -261,7 +261,7 @@ class Extract
$delimiter = Functions::flattenArray($delimiter);
$quotedDelimiters = array_map(
function ($delimiter) {
return preg_quote($delimiter ?? '');
return preg_quote($delimiter ?? '', '/');
},
$delimiter
);
@@ -270,7 +270,7 @@ class Extract
return '(' . $delimiters . ')';
}
return '(' . preg_quote($delimiter ?? '') . ')';
return '(' . preg_quote($delimiter ?? '', '/') . ')';
}
private static function matchFlags(int $matchMode): string
@@ -294,7 +294,7 @@ class Format
}
if (!is_numeric($value)) {
$decimalPositions = preg_match_all('/' . preg_quote($decimalSeparator) . '/', $value, $matches, PREG_OFFSET_CAPTURE);
$decimalPositions = preg_match_all('/' . preg_quote($decimalSeparator, '/') . '/', $value, $matches, PREG_OFFSET_CAPTURE);
if ($decimalPositions > 1) {
return ExcelError::VALUE();
}
@@ -193,7 +193,7 @@ class Text
if (is_array($delimiter) && count($valueSet) > 1) {
$quotedDelimiters = array_map(
function ($delimiter) {
return preg_quote($delimiter ?? '');
return preg_quote($delimiter ?? '', '/');
},
$valueSet
);
@@ -202,7 +202,7 @@ class Text
return '(' . $delimiters . ')';
}
return '(' . preg_quote(/** @scrutinizer ignore-type */ Functions::flattenSingleValue($delimiter)) . ')';
return '(' . preg_quote(/** @scrutinizer ignore-type */ Functions::flattenSingleValue($delimiter), '/') . ')';
}
private static function matchFlags(bool $matchMode): string
@@ -51,6 +51,8 @@ return [
],
'no arguments' => ['exception'],
'boolean argument' => ['#VALUE!', true],
'slash as group separator' => [1234567.1, '1/234/567.1', '.', '/'],
'slash as decimal separator' => [1234567.1, '1,234,567/1', '/', ','],
'issue 3574 null string treated as 0' => [0, '', ',', ' '],
'issue 3574 one or more spaces treated as 0' => [0, ' ', ',', ' '],
'issue 3574 non-blank numeric string okay' => [2, ' 2 ', ',', ' '],
@@ -248,4 +248,11 @@ return [
1,
],
],
'slash delimiter' => [
'about/that',
[
'How/about/that',
'/',
],
],
];
@@ -240,4 +240,11 @@ return [
1,
],
],
'slash delimiter' => [
'How',
[
'How/about/that',
'/',
],
],
];
@@ -104,4 +104,20 @@ return [
'',
],
],
'slash as column delimiter' => [
[['Hello', 'World']],
[
'Hello/World',
'/',
'',
],
],
'slash as row delimiter' => [
[['ho', 'w'], ['about', '#N/A'], ['t', 'hat']],
[
'ho.w/about/t.hat',
'.',
'/',
],
],
];