diff --git a/.php-cs-fixer.dist.php b/.php-cs-fixer.dist.php index 84301454fd..56c278bc0c 100644 --- a/.php-cs-fixer.dist.php +++ b/.php-cs-fixer.dist.php @@ -223,7 +223,7 @@ 'static_lambda' => false, // Risky if we can't guarantee nobody use `bindTo()` 'strict_comparison' => false, // No, too dangerous to change that 'strict_param' => false, // No, too dangerous to change that - 'string_implicit_backslashes' => false, // was escape_implicit_backslashes, too confusing + 'string_implicit_backslashes' => ['single_quoted' => 'unescape', 'double_quoted' => 'escape', 'heredoc' => 'escape'], // was escape_implicit_backslashes 'string_length_to_empty' => true, 'string_line_ending' => true, 'switch_case_semicolon_to_colon' => true, diff --git a/CHANGELOG.md b/CHANGELOG.md index 5544f84722..2f001e1a50 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,10 @@ and this project adheres to [Semantic Versioning](https://semver.org). # TBD - 2.1.10 +### Changed + +- Allow php-cs-fixer to Handle Implicit Backslashes. + ### Fixed - TEXT and TIMEVALUE functions. [Issue #4249](https://github.com/PHPOffice/PhpSpreadsheet/issues/4249) [PR #4353](https://github.com/PHPOffice/PhpSpreadsheet/pull/4353) diff --git a/bin/findpolyfill.php b/bin/findpolyfill.php index 7a836ec7fa..7077ab079c 100644 --- a/bin/findpolyfill.php +++ b/bin/findpolyfill.php @@ -6,11 +6,11 @@ function findPolyfill(string $directory): int // See issue #4215 - code which should have erred in unit test // succeeded because a dev package required polyfills. $retCode = 0; - $polyfill81 = 'MYSQLI_REFRESH_REPLICA\\b' + $polyfill81 = 'MYSQLI_REFRESH_REPLICA\b' . '|fdiv[(]' . '|array_is_list[(]' . '|enum_exists[(]'; - $polyfill = '/\\b(?:' + $polyfill = '/\b(?:' . $polyfill81 . ')/'; diff --git a/composer.json b/composer.json index 7d366ee13e..0793de44f0 100644 --- a/composer.json +++ b/composer.json @@ -15,6 +15,7 @@ "platform": { "php" : "8.0.99" }, + "process-timeout": 600, "sort-packages": true, "allow-plugins": { "dealerdirect/phpcodesniffer-composer-installer": true diff --git a/src/PhpSpreadsheet/Calculation/Calculation.php b/src/PhpSpreadsheet/Calculation/Calculation.php index 6028a9d72f..61557b69a6 100644 --- a/src/PhpSpreadsheet/Calculation/Calculation.php +++ b/src/PhpSpreadsheet/Calculation/Calculation.php @@ -50,7 +50,7 @@ class Calculation // Defined Names: Named Range of cells, or Named Formulae const CALCULATION_REGEXP_DEFINEDNAME = '((([^\s,!&%^\/\*\+<>=-]*)|(\'(?:[^\']|\'[^!])+?\')|(\"(?:[^\"]|\"[^!])+?\"))!)?([_\p{L}][_\p{L}\p{N}\.]*)'; // Structured Reference (Fully Qualified and Unqualified) - const CALCULATION_REGEXP_STRUCTURED_REFERENCE = '([\p{L}_\\\\][\p{L}\p{N}\._]+)?(\[(?:[^\d\]+-])?)'; + const CALCULATION_REGEXP_STRUCTURED_REFERENCE = '([\p{L}_\\\][\p{L}\p{N}\._]+)?(\[(?:[^\d\]+-])?)'; // Error const CALCULATION_REGEXP_ERROR = '\#[A-Z][A-Z0_\/]*[!\?]?'; diff --git a/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php b/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php index 8c5fa71c94..b6411df58d 100644 --- a/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php +++ b/src/PhpSpreadsheet/Calculation/DateTimeExcel/DateValue.php @@ -47,7 +47,7 @@ public static function fromString(null|array|string|int|bool|float $dateValue): } // try to parse as date iff there is at least one digit - if (is_string($dateValue) && preg_match('/\\d/', $dateValue) !== 1) { + if (is_string($dateValue) && preg_match('/\d/', $dateValue) !== 1) { return ExcelError::VALUE(); } diff --git a/src/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php b/src/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php index fc2b5ea47d..15c8762030 100644 --- a/src/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php +++ b/src/PhpSpreadsheet/Calculation/Engine/Operands/StructuredReference.php @@ -29,7 +29,7 @@ final class StructuredReference implements Operand, Stringable self::ITEM_SPECIFIER_TOTALS, ]; - private const TABLE_REFERENCE = '/([\p{L}_\\\\][\p{L}\p{N}\._]+)?(\[(?:[^\]\[]+|(?R))*+\])/miu'; + private const TABLE_REFERENCE = '/([\p{L}_\\\][\p{L}\p{N}\._]+)?(\[(?:[^\]\[]+|(?R))*+\])/miu'; private string $value; diff --git a/src/PhpSpreadsheet/Calculation/FormulaParser.php b/src/PhpSpreadsheet/Calculation/FormulaParser.php index 9868b82840..f07b5b5db2 100644 --- a/src/PhpSpreadsheet/Calculation/FormulaParser.php +++ b/src/PhpSpreadsheet/Calculation/FormulaParser.php @@ -213,7 +213,7 @@ private function parseToTokens(): void // scientific notation check if (str_contains(self::OPERATORS_SN, $this->formula[$index])) { if (strlen($value) > 1) { - if (preg_match('/^[1-9]{1}(\\.\\d+)?E{1}$/', $this->formula[$index]) != 0) { + if (preg_match('/^[1-9]{1}(\.\d+)?E{1}$/', $this->formula[$index]) != 0) { $value .= $this->formula[$index]; ++$index; diff --git a/src/PhpSpreadsheet/Calculation/Functions.php b/src/PhpSpreadsheet/Calculation/Functions.php index 6b74500698..e8d3234056 100644 --- a/src/PhpSpreadsheet/Calculation/Functions.php +++ b/src/PhpSpreadsheet/Calculation/Functions.php @@ -308,7 +308,7 @@ public static function expandDefinedName(string $coordinate, Cell $cell): string public static function trimTrailingRange(string $coordinate): string { - return (string) preg_replace('/:[\\w\$]+$/', '', $coordinate); + return (string) preg_replace('/:[\w\$]+$/', '', $coordinate); } public static function trimSheetFromCellReference(string $coordinate): string diff --git a/src/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php b/src/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php index 371ad8b3d1..8282ea289c 100644 --- a/src/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php +++ b/src/PhpSpreadsheet/Calculation/Internal/WildcardMatch.php @@ -6,10 +6,10 @@ class WildcardMatch { private const SEARCH_SET = [ '~~', // convert double tilde to unprintable value - '~\\*', // convert tilde backslash asterisk to [*] (matches literal asterisk in regexp) - '\\*', // convert backslash asterisk to .* (matches string of any length in regexp) - '~\\?', // convert tilde backslash question to [?] (matches literal question mark in regexp) - '\\?', // convert backslash question to . (matches one character in regexp) + '~\*', // convert tilde backslash asterisk to [*] (matches literal asterisk in regexp) + '\*', // convert backslash asterisk to .* (matches string of any length in regexp) + '~\?', // convert tilde backslash question to [?] (matches literal question mark in regexp) + '\?', // convert backslash question to . (matches one character in regexp) "\x1c", // convert original double tilde to single tilde ]; diff --git a/src/PhpSpreadsheet/Calculation/TextData/Trim.php b/src/PhpSpreadsheet/Calculation/TextData/Trim.php index d8f170621f..d83e14dd46 100644 --- a/src/PhpSpreadsheet/Calculation/TextData/Trim.php +++ b/src/PhpSpreadsheet/Calculation/TextData/Trim.php @@ -25,7 +25,7 @@ public static function nonPrintable(mixed $stringValue = '') $stringValue = Helpers::extractString($stringValue); - return (string) preg_replace('/[\\x00-\\x1f]/', '', "$stringValue"); + return (string) preg_replace('/[\x00-\x1f]/', '', "$stringValue"); } /** diff --git a/src/PhpSpreadsheet/Cell/DefaultValueBinder.php b/src/PhpSpreadsheet/Cell/DefaultValueBinder.php index 2710ead434..f3690321eb 100644 --- a/src/PhpSpreadsheet/Cell/DefaultValueBinder.php +++ b/src/PhpSpreadsheet/Cell/DefaultValueBinder.php @@ -56,7 +56,7 @@ public static function dataTypeForValue(mixed $value): string return DataType::TYPE_INLINE; } elseif (is_string($value) && strlen($value) > 1 && $value[0] === '=') { return DataType::TYPE_FORMULA; - } elseif (preg_match('/^[\+\-]?(\d+\\.?\d*|\d*\\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $value)) { + } elseif (preg_match('/^[\+\-]?(\d+\.?\d*|\d*\.?\d+)([Ee][\-\+]?[0-2]?\d{1,3})?$/', $value)) { $tValue = ltrim($value, '+-'); if (is_string($value) && strlen($tValue) > 1 && $tValue[0] === '0' && $tValue[1] !== '.') { return DataType::TYPE_STRING; diff --git a/src/PhpSpreadsheet/Document/Properties.php b/src/PhpSpreadsheet/Document/Properties.php index 5762169184..6cad8a9ffd 100644 --- a/src/PhpSpreadsheet/Document/Properties.php +++ b/src/PhpSpreadsheet/Document/Properties.php @@ -149,8 +149,8 @@ private static function intOrFloatTimestamp(null|bool|float|int|string $timestam $timestamp = (float) $timestamp; } else { $timestamp = (string) preg_replace('/[.][0-9]*$/', '', $timestamp); - $timestamp = (string) preg_replace('/^(\\d{4})- (\\d)/', '$1-0$2', $timestamp); - $timestamp = (string) preg_replace('/^(\\d{4}-\\d{2})- (\\d)/', '$1-0$2', $timestamp); + $timestamp = (string) preg_replace('/^(\d{4})- (\d)/', '$1-0$2', $timestamp); + $timestamp = (string) preg_replace('/^(\d{4}-\d{2})- (\d)/', '$1-0$2', $timestamp); $timestamp = (float) (new DateTime($timestamp))->format('U'); } } diff --git a/src/PhpSpreadsheet/Reader/Html.php b/src/PhpSpreadsheet/Reader/Html.php index d8f117b2c2..e44f85ae9f 100644 --- a/src/PhpSpreadsheet/Reader/Html.php +++ b/src/PhpSpreadsheet/Reader/Html.php @@ -32,7 +32,7 @@ class Html extends BaseReader private const STARTS_WITH_BOM = '/^(?:\xfe\xff|\xff\xfe|\xEF\xBB\xBF)/'; - private const DECLARES_CHARSET = '/\\bcharset=/i'; + private const DECLARES_CHARSET = '/\bcharset=/i'; /** * Input encoding. diff --git a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php index c4c85bdff1..208709da46 100644 --- a/src/PhpSpreadsheet/Reader/Security/XmlScanner.php +++ b/src/PhpSpreadsheet/Reader/Security/XmlScanner.php @@ -6,8 +6,8 @@ class XmlScanner { - private const ENCODING_PATTERN = '/encoding\\s*=\\s*(["\'])(.+?)\\1/s'; - private const ENCODING_UTF7 = '/encoding\\s*=\\s*(["\'])UTF-7\\1/si'; + private const ENCODING_PATTERN = '/encoding\s*=\s*(["\'])(.+?)\1/s'; + private const ENCODING_UTF7 = '/encoding\s*=\s*(["\'])UTF-7\1/si'; private string $pattern; @@ -41,7 +41,7 @@ private function toUtf8(string $xml): string $charset = $this->findCharSet($xml); $foundUtf7 = $charset === 'UTF-7'; if ($charset !== 'UTF-8') { - $testStart = '/^.{0,4}\\s*pattern)) . '\\0*/'; + $pattern = '/\0*' . implode('\0*', str_split($this->pattern)) . '\0*/'; $xml = "$xml"; if (preg_match($pattern, $xml)) { diff --git a/src/PhpSpreadsheet/Reader/Slk.php b/src/PhpSpreadsheet/Reader/Slk.php index 775e5e8bb1..ad73b8b546 100644 --- a/src/PhpSpreadsheet/Reader/Slk.php +++ b/src/PhpSpreadsheet/Reader/Slk.php @@ -358,7 +358,7 @@ private function styleSettings(string $rowDatum, array &$styleData, string &$fon } elseif ($char == 'S') { $styleData['fill']['fillType'] = Fill::FILL_PATTERN_GRAY125; } elseif ($char == 'M') { - if (preg_match('/M([1-9]\\d*)/', $styleSettings, $matches)) { + if (preg_match('/M([1-9]\d*)/', $styleSettings, $matches)) { $fontStyle = $matches[1]; } } @@ -446,7 +446,7 @@ private function processPRecord(array $rowData, Spreadsheet &$spreadsheet): void private function processPColors(string $rowDatum, array &$formatArray): void { - if (preg_match('/L([1-9]\\d*)/', $rowDatum, $matches)) { + if (preg_match('/L([1-9]\d*)/', $rowDatum, $matches)) { $fontColor = $matches[1] % 8; // @phpstan-ignore-line $formatArray['font']['color']['argb'] = self::COLOR_ARRAY[$fontColor]; } diff --git a/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php b/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php index d494dc9dad..134a013f7c 100644 --- a/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php +++ b/src/PhpSpreadsheet/Reader/Xlsx/DataValidations.php @@ -25,7 +25,7 @@ public function load(): void $range = strtoupper((string) $dataValidation['sqref']); $rangeSet = explode(' ', $range); foreach ($rangeSet as $range) { - if (preg_match('/^[A-Z]{1,3}\\d{1,7}/', $range, $matches) === 1) { + if (preg_match('/^[A-Z]{1,3}\d{1,7}/', $range, $matches) === 1) { // Ensure left/top row of range exists, thereby // adjusting high row/column. $this->worksheet->getCell($matches[0]); diff --git a/src/PhpSpreadsheet/Shared/Date.php b/src/PhpSpreadsheet/Shared/Date.php index ed19534de0..3705d9ebde 100644 --- a/src/PhpSpreadsheet/Shared/Date.php +++ b/src/PhpSpreadsheet/Shared/Date.php @@ -178,7 +178,7 @@ public static function convertIsoDate(mixed $value): float|int throw new Exception("Invalid string $value supplied for datatype Date"); } - if (preg_match('/^\\s*\\d?\\d:\\d\\d(:\\d\\d([.]\\d+)?)?\\s*(am|pm)?\\s*$/i', $value) == 1) { + if (preg_match('/^\s*\d?\d:\d\d(:\d\d([.]\d+)?)?\s*(am|pm)?\s*$/i', $value) == 1) { $newValue = fmod($newValue, 1.0); } diff --git a/src/PhpSpreadsheet/Shared/Font.php b/src/PhpSpreadsheet/Shared/Font.php index 8a1225b1cf..f9370b4e18 100644 --- a/src/PhpSpreadsheet/Shared/Font.php +++ b/src/PhpSpreadsheet/Shared/Font.php @@ -563,7 +563,7 @@ public static function getTrueTypeFontFileFromFont(FontStyle $font, bool $checkP if (mb_strlen(self::$trueTypeFontPath) > 1 && mb_substr(self::$trueTypeFontPath, -1) !== '/' && mb_substr(self::$trueTypeFontPath, -1) !== '\\') { $separator = DIRECTORY_SEPARATOR; } - $fontFileAbsolute = preg_match('~^([A-Za-z]:)?[/\\\\]~', $fontFile) === 1; + $fontFileAbsolute = preg_match('~^([A-Za-z]:)?[/\\\]~', $fontFile) === 1; if (!$fontFileAbsolute) { $fontFile = self::findFontFile(self::$trueTypeFontPath, $fontFile) ?? self::$trueTypeFontPath . $separator . $fontFile; } diff --git a/src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php b/src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php index 9ba3760e40..11f41f3e88 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/DateFormatter.php @@ -163,7 +163,7 @@ public static function format(mixed $value, string $format): string // If the colon preceding minute had been quoted, as happens in // Excel 2003 XML formats, m will not have been changed to i above. // Change it now. - $format = (string) \preg_replace('/\\\\:m/', ':i', $format); + $format = (string) \preg_replace('/\\\:m/', ':i', $format); $microseconds = (int) $dateObj->format('u'); if (str_contains($format, ':s.000')) { $milliseconds = (int) round($microseconds / 1000.0); diff --git a/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php b/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php index f2d492e5d9..a247d13ebb 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/Formatter.php @@ -54,8 +54,8 @@ private static function splitFormatForSectionSelection(array $sections, mixed $v // 4 sections: [POSITIVE] [NEGATIVE] [ZERO] [TEXT] $sectionCount = count($sections); // Colour could be a named colour, or a numeric index entry in the colour-palette - $color_regex = '/\\[(' . implode('|', Color::NAMED_COLORS) . '|color\\s*(\\d+))\\]/mui'; - $cond_regex = '/\\[(>|>=|<|<=|=|<>)([+-]?\\d+([.]\\d+)?)\\]/'; + $color_regex = '/\[(' . implode('|', Color::NAMED_COLORS) . '|color\s*(\d+))\]/mui'; + $cond_regex = '/\[(>|>=|<|<=|=|<>)([+-]?\d+([.]\d+)?)\]/'; $colors = ['', '', '', '', '']; $conditionOperations = ['', '', '', '', '']; $conditionComparisonValues = [0, 0, 0, 0, 0]; @@ -141,7 +141,7 @@ public static function toFormattedString($value, string $format, ?array $callBac $format = (string) preg_replace('/^\[\$-[^\]]*\]/', '', $format); $format = (string) preg_replace_callback( - '/(["])(?:(?=(\\\\?))\\2.)*?\\1/u', + '/(["])(?:(?=(\\\?))\2.)*?\1/u', fn (array $matches): string => str_replace('.', chr(0x00), $matches[0]), $format ); diff --git a/src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php b/src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php index ff80aa2f53..4ff3ecfd9f 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/FractionFormatter.php @@ -61,7 +61,7 @@ public static function format(mixed $value, string $format): string private static function getDecimal(string $value): string { $decimalPart = '0'; - if (preg_match('/^\\d*[.](\\d*[1-9])0*$/', $value, $matches) === 1) { + if (preg_match('/^\d*[.](\d*[1-9])0*$/', $value, $matches) === 1) { $decimalPart = $matches[1]; } diff --git a/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php b/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php index 3435c4f58d..2285489d15 100644 --- a/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php +++ b/src/PhpSpreadsheet/Style/NumberFormat/NumberFormatter.php @@ -7,7 +7,7 @@ class NumberFormatter extends BaseFormatter { - private const NUMBER_REGEX = '/(0+)(\\.?)(0*)/'; + private const NUMBER_REGEX = '/(0+)(\.?)(0*)/'; private static function mergeComplexNumberFormatMasks(array $numbers, array $masks): array { @@ -211,11 +211,11 @@ public static function format(mixed $value, string $format): string $paddingPlaceholder = (str_contains($format, '?')); // Replace # or ? with 0 - $format = self::pregReplace('/[\\#\?](?=(?:[^"]*"[^"]*")*[^"]*\Z)/', '0', $format); + $format = self::pregReplace('/[\#\?](?=(?:[^"]*"[^"]*")*[^"]*\Z)/', '0', $format); // Remove locale code [$-###] for an LCID $format = self::pregReplace('/\[\$\-.*\]/', '', $format); - $n = '/\\[[^\\]]+\\]/'; + $n = '/\[[^\]]+\]/'; $m = self::pregReplace($n, '', $format); // Some non-number strings are quoted, so we'll get rid of the quotes, likewise any positional * symbols diff --git a/src/PhpSpreadsheet/Worksheet/AutoFilter.php b/src/PhpSpreadsheet/Worksheet/AutoFilter.php index b69597baac..6f9bb503ed 100644 --- a/src/PhpSpreadsheet/Worksheet/AutoFilter.php +++ b/src/PhpSpreadsheet/Worksheet/AutoFilter.php @@ -143,7 +143,7 @@ public function setRangeToMaxRow(): self $this->evaluated = false; if ($this->workSheet !== null) { $thisrange = $this->range; - $range = (string) preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); + $range = (string) preg_replace('/\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); if ($range !== $thisrange) { $this->setRange($range); } diff --git a/src/PhpSpreadsheet/Worksheet/Drawing.php b/src/PhpSpreadsheet/Worksheet/Drawing.php index 5905d7f2fe..ecc1aa1fbc 100644 --- a/src/PhpSpreadsheet/Worksheet/Drawing.php +++ b/src/PhpSpreadsheet/Worksheet/Drawing.php @@ -103,7 +103,7 @@ public function setPath(string $path, bool $verifyFile = true, ?ZipArchive $zip $this->path = ''; // Check if a URL has been passed. https://stackoverflow.com/a/2058596/1252979 - if (filter_var($path, FILTER_VALIDATE_URL) || (preg_match('/^([\\w\\s\\x00-\\x1f]+):/u', $path) && !preg_match('/^([\\w]+):/u', $path))) { + if (filter_var($path, FILTER_VALIDATE_URL) || (preg_match('/^([\w\s\x00-\x1f]+):/u', $path) && !preg_match('/^([\w]+):/u', $path))) { if (!preg_match('/^(http|https|file|ftp|s3):/', $path)) { throw new PhpSpreadsheetException('Invalid protocol for linked drawing'); } diff --git a/src/PhpSpreadsheet/Worksheet/Table.php b/src/PhpSpreadsheet/Worksheet/Table.php index ab05f5d5e9..76c121855a 100644 --- a/src/PhpSpreadsheet/Worksheet/Table.php +++ b/src/PhpSpreadsheet/Worksheet/Table.php @@ -116,10 +116,10 @@ public function setName(string $name): self ) { throw new PhpSpreadsheetException('The table name can\'t be the same as a cell reference'); } - if (!preg_match('/^[\p{L}_\\\\]/iu', $name)) { + if (!preg_match('/^[\p{L}_\\\]/iu', $name)) { throw new PhpSpreadsheetException('The table name must begin a name with a letter, an underscore character (_), or a backslash (\)'); } - if (!preg_match('/^[\p{L}_\\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { + if (!preg_match('/^[\p{L}_\\\][\p{L}\p{M}0-9\._]+$/iu', $name)) { throw new PhpSpreadsheetException('The table name contains invalid characters'); } @@ -317,7 +317,7 @@ public function setRangeToMaxRow(): self { if ($this->workSheet !== null) { $thisrange = $this->range; - $range = (string) preg_replace('/\\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); + $range = (string) preg_replace('/\d+$/', (string) $this->workSheet->getHighestRow(), $thisrange); if ($range !== $thisrange) { $this->setRange($range); } diff --git a/src/PhpSpreadsheet/Worksheet/Validations.php b/src/PhpSpreadsheet/Worksheet/Validations.php index c7dd377d44..c87580db3d 100644 --- a/src/PhpSpreadsheet/Worksheet/Validations.php +++ b/src/PhpSpreadsheet/Worksheet/Validations.php @@ -71,7 +71,7 @@ public static function validateCellRange(AddressRange|string|array $cellRange): // Convert Column ranges like 'A:C' to 'A1:C1048576' // or Row ranges like '1:3' to 'A1:XFD3' $addressRange = (string) preg_replace( - ['/^([A-Z]+):([A-Z]+)$/i', '/^(\\d+):(\\d+)$/'], + ['/^([A-Z]+):([A-Z]+)$/i', '/^(\d+):(\d+)$/'], [self::SETMAXROW, self::SETMAXCOL], $addressRange ?? '' ); diff --git a/src/PhpSpreadsheet/Worksheet/Worksheet.php b/src/PhpSpreadsheet/Worksheet/Worksheet.php index dbc1421646..3dca29c92c 100644 --- a/src/PhpSpreadsheet/Worksheet/Worksheet.php +++ b/src/PhpSpreadsheet/Worksheet/Worksheet.php @@ -1700,7 +1700,7 @@ public function mergeCells(AddressRange|string|array $range, string $behaviour = $range .= ":{$range}"; } - if (preg_match('/^([A-Z]+)(\\d+):([A-Z]+)(\\d+)$/', $range, $matches) !== 1) { + if (preg_match('/^([A-Z]+)(\d+):([A-Z]+)(\d+)$/', $range, $matches) !== 1) { throw new Exception('Merge must be on a valid range of cells.'); } diff --git a/src/PhpSpreadsheet/Writer/Html.php b/src/PhpSpreadsheet/Writer/Html.php index 19ca5f4eb0..d03f7a1870 100644 --- a/src/PhpSpreadsheet/Writer/Html.php +++ b/src/PhpSpreadsheet/Writer/Html.php @@ -1351,7 +1351,7 @@ private function generateRowCellData(Worksheet $worksheet, null|Cell|string $cel // Converts the cell content so that spaces occuring at beginning of each new line are replaced by   // Example: " Hello\n to the world" is converted to "  Hello\n to the world" - $cellData = Preg::replace('/(?m)(?:^|\\G) /', ' ', $cellData); + $cellData = Preg::replace('/(?m)(?:^|\G) /', ' ', $cellData); // convert newline "\n" to '
' $cellData = nl2br($cellData); @@ -1496,8 +1496,8 @@ private function generateRow(Worksheet $worksheet, array $values, int $row, stri if ($worksheet->hyperlinkExists($coordinate) && !$worksheet->getHyperlink($coordinate)->isInternal()) { $url = $worksheet->getHyperlink($coordinate)->getUrl(); $urlDecode1 = html_entity_decode($url, ENT_QUOTES | ENT_SUBSTITUTE, 'UTF-8'); - $urlTrim = Preg::replace('/^\\s+/u', '', $urlDecode1); - $parseScheme = Preg::isMatch('/^([\\w\\s\\x00-\\x1f]+):/u', strtolower($urlTrim), $matches); + $urlTrim = Preg::replace('/^\s+/u', '', $urlDecode1); + $parseScheme = Preg::isMatch('/^([\w\s\x00-\x1f]+):/u', strtolower($urlTrim), $matches); if ($parseScheme && !in_array($matches[1], ['http', 'https', 'file', 'ftp', 'mailto', 's3'], true)) { $cellData = htmlspecialchars($url, Settings::htmlEntityFlags()); $cellData = self::replaceControlChars($cellData); @@ -1550,7 +1550,7 @@ public static function replaceNonAscii(array $matches): string private static function replaceControlChars(string $convert): string { return Preg::replaceCallback( - '/[\\x00-\\x1f]/', + '/[\x00-\x1f]/', [self::class, 'replaceNonAscii'], $convert ); @@ -1642,7 +1642,7 @@ public function formatColor(string $value, string $format): string $color = null; // initialize $matches = []; - $color_regex = '/^\\[[a-zA-Z]+\\]/'; + $color_regex = '/^\[[a-zA-Z]+\]/'; if (Preg::isMatch($color_regex, $format, $matches)) { $color = str_replace(['[', ']'], '', $matches[0]); // @phpstan-ignore-line $color = strtolower($color); diff --git a/src/PhpSpreadsheet/Writer/Xls/Parser.php b/src/PhpSpreadsheet/Writer/Xls/Parser.php index dd49b619b4..e3ae80bb26 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Parser.php +++ b/src/PhpSpreadsheet/Writer/Xls/Parser.php @@ -49,22 +49,22 @@ class Parser // Former value for this constant led to "catastrophic backtracking", // unable to handle double apostrophes. // (*COMMIT) should prevent this. - const REGEX_SHEET_TITLE_QUOTED = "([^*:/\\\\?\[\]']|'')+"; + const REGEX_SHEET_TITLE_QUOTED = "([^*:/\\\\?\\[\\]']|'')+"; const REGEX_CELL_TITLE_QUOTED = "~^'" . self::REGEX_SHEET_TITLE_QUOTED . '(:' . self::REGEX_SHEET_TITLE_QUOTED . ')?' . "'!(*COMMIT)" - . '[$]?[A-Ia-i]?[A-Za-z][$]?(\\d+)' + . '[$]?[A-Ia-i]?[A-Za-z][$]?(\d+)' . '$~u'; const REGEX_RANGE_TITLE_QUOTED = "~^'" . self::REGEX_SHEET_TITLE_QUOTED . '(:' . self::REGEX_SHEET_TITLE_QUOTED . ')?' . "'!(*COMMIT)" - . '[$]?[A-Ia-i]?[A-Za-z][$]?(\\d+)' + . '[$]?[A-Ia-i]?[A-Za-z][$]?(\d+)' . ':' - . '[$]?[A-Ia-i]?[A-Za-z][$]?(\\d+)' + . '[$]?[A-Ia-i]?[A-Za-z][$]?(\d+)' . '$~u'; private const UTF8 = 'UTF-8'; @@ -511,7 +511,7 @@ private function convert(string $token): string return $this->convertRef2d($token); } // match external references like Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1 - if (Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?(\\d+)$/u', $token)) { + if (Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\!\$?[A-Ia-i]?[A-Za-z]\$?(\d+)$/u', $token)) { return $this->convertRef3d($token); } // match external references like 'Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1 @@ -523,7 +523,7 @@ private function convert(string $token): string return $this->convertRange2d($token); } // match external ranges like Sheet1!A1:B2 or Sheet1:Sheet2!A1:B2 or Sheet1!$A$1:$B$2 or Sheet1:Sheet2!$A$1:$B$2 - if (Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?(\\d+)\\:\$?([A-Ia-i]?[A-Za-z])?\$?(\\d+)$/u', $token)) { + if (Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\!\$?([A-Ia-i]?[A-Za-z])?\$?(\d+)\:\$?([A-Ia-i]?[A-Za-z])?\$?(\d+)$/u', $token)) { return $this->convertRange3d($token); } // match external ranges like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 @@ -535,7 +535,7 @@ private function convert(string $token): string return pack('C', $this->ptg[$token]); } // match error codes - if (Preg::isMatch('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $token) || $token == '#N/A') { + if (Preg::isMatch('/^#[A-Z0\/]{3,5}[!?]{1}$/', $token) || $token == '#N/A') { return $this->convertError($token); } if (Preg::isMatch('/^' . Calculation::CALCULATION_REGEXP_DEFINEDNAME . '$/mui', $token) && $this->spreadsheet->getDefinedName($token) !== null) { @@ -569,7 +569,7 @@ private function convert(string $token): string private function convertNumber(mixed $num): string { // Integer in the range 0..2**16-1 - if ((Preg::isMatch('/^\\d+$/', (string) $num)) && ($num <= 65535)) { + if ((Preg::isMatch('/^\d+$/', (string) $num)) && ($num <= 65535)) { return pack('Cv', $this->ptg['ptgInt'], $num); } @@ -680,7 +680,7 @@ private function convertRange3d(string $token): string [$cell1, $cell2] = explode(':', $range ?? ''); // Convert the cell references - if (Preg::isMatch('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\\d+)$/', $cell1)) { + if (Preg::isMatch('/^(\$)?[A-Ia-i]?[A-Za-z](\$)?(\d+)$/', $cell1)) { [$row1, $col1] = $this->cellToPackedRowcol($cell1); [$row2, $col2] = $this->cellToPackedRowcol($cell2); } else { // It's a rows range (like 26:27) @@ -1087,7 +1087,7 @@ private function match(string $token): string } // If it's an external reference (Sheet1!A1 or Sheet1:Sheet2!A1 or Sheet1!$A$1 or Sheet1:Sheet2!$A$1) if ( - Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?\\d+$/u', $token) + Preg::isMatch('/^' . self::REGEX_SHEET_TITLE_UNQUOTED . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED . ')?\!\$?[A-Ia-i]?[A-Za-z]\$?\d+$/u', $token) && !Preg::isMatch('/\d/', $this->lookAhead) && ($this->lookAhead !== ':') && ($this->lookAhead !== '.') @@ -1097,7 +1097,7 @@ private function match(string $token): string // If it's an external reference ('Sheet1'!A1 or 'Sheet1:Sheet2'!A1 or 'Sheet1'!$A$1 or 'Sheet1:Sheet2'!$A$1) if ( self::matchCellSheetnameQuoted($token) - && !Preg::isMatch('/\\d/', $this->lookAhead) + && !Preg::isMatch('/\d/', $this->lookAhead) && ($this->lookAhead !== ':') && ($this->lookAhead !== '.') ) { return $token; @@ -1117,8 +1117,8 @@ private function match(string $token): string Preg::isMatch( '/^' . self::REGEX_SHEET_TITLE_UNQUOTED - . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED - . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?\\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\\d+$/u', + . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED + . ')?\!\$?([A-Ia-i]?[A-Za-z])?\$?\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\d+$/u', $token ) && !Preg::isMatch('/\d/', $this->lookAhead) @@ -1128,7 +1128,7 @@ private function match(string $token): string // If it's an external range like 'Sheet1'!A1:B2 or 'Sheet1:Sheet2'!A1:B2 or 'Sheet1'!$A$1:$B$2 or 'Sheet1:Sheet2'!$A$1:$B$2 if ( self::matchRangeSheetnameQuoted($token) - && !Preg::isMatch('/\\d/', $this->lookAhead) + && !Preg::isMatch('/\d/', $this->lookAhead) ) { return $token; } @@ -1146,7 +1146,7 @@ private function match(string $token): string } // If it's an error code if ( - Preg::isMatch('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $token) + Preg::isMatch('/^#[A-Z0\/]{3,5}[!?]{1}$/', $token) || $token === '#N/A' ) { return $token; @@ -1272,7 +1272,7 @@ private function expression(): array return $result; } if ( - Preg::isMatch('/^#[A-Z0\\/]{3,5}[!?]{1}$/', $this->currentToken) + Preg::isMatch('/^#[A-Z0\/]{3,5}[!?]{1}$/', $this->currentToken) || $this->currentToken == '#N/A' ) { // error code $result = $this->createTree($this->currentToken, 'ptgErr', ''); @@ -1396,8 +1396,8 @@ private function fact(): array Preg::isMatch( '/^' . self::REGEX_SHEET_TITLE_UNQUOTED - . '(\\:' . self::REGEX_SHEET_TITLE_UNQUOTED - . ')?\\!\$?[A-Ia-i]?[A-Za-z]\$?\\d+$/u', + . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED + . ')?\!\$?[A-Ia-i]?[A-Za-z]\$?\d+$/u', $this->currentToken ) ) { @@ -1435,9 +1435,9 @@ private function fact(): array Preg::isMatch( '/^' . self::REGEX_SHEET_TITLE_UNQUOTED - . '(\\:' + . '(\:' . self::REGEX_SHEET_TITLE_UNQUOTED - . ')?\\!\$?([A-Ia-i]?[A-Za-z])?\$?\\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\\d+$/u', + . ')?\!\$?([A-Ia-i]?[A-Za-z])?\$?\d+:\$?([A-Ia-i]?[A-Za-z])?\$?\d+$/u', $this->currentToken ) ) { @@ -1613,7 +1613,7 @@ public function toReversePolish(array $tree = []): string Preg::isMatch("/^[A-Z0-9\xc0-\xdc\\.]+$/", $tree['value']) && !Preg::isMatch('/^([A-Ia-i]?[A-Za-z])(\d+)$/', $tree['value']) && !Preg::isMatch( - '/^[A-Ia-i]?[A-Za-z](\\d+)\\.\\.[A-Ia-i]?[A-Za-z](\\d+)$/', + '/^[A-Ia-i]?[A-Za-z](\d+)\.\.[A-Ia-i]?[A-Za-z](\d+)$/', $tree['value'] ) && !is_numeric($tree['value']) diff --git a/src/PhpSpreadsheet/Writer/Xls/Worksheet.php b/src/PhpSpreadsheet/Writer/Xls/Worksheet.php index a2f33985a5..ba6cc6b6c1 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -459,7 +459,7 @@ public function close(): void $url = str_replace('sheet://', 'internal:', $url); } elseif (preg_match('/^(http:|https:|ftp:|mailto:)/', $url)) { // URL - } elseif (!empty($hyperlinkbase) && preg_match('~^([A-Za-z]:)?[/\\\\]~', $url) !== 1) { + } elseif (!empty($hyperlinkbase) && preg_match('~^([A-Za-z]:)?[/\\\]~', $url) !== 1) { $url = "$hyperlinkbase$url"; if (preg_match('/^(http:|https:|ftp:|mailto:)/', $url) !== 1) { $url = 'external:' . $url; @@ -1017,7 +1017,7 @@ private function writeUrlExternal(int $row1, int $col1, int $row2, int $col2, st { // Network drives are different. We will handle them separately // MS/Novell network drives and shares start with \\ - if (preg_match('[^external:\\\\]', $url)) { + if (preg_match('[^external:\\\]', $url)) { return; } @@ -1042,7 +1042,7 @@ private function writeUrlExternal(int $row1, int $col1, int $row2, int $col2, st // parameters accordingly. // Split the dir name and sheet name (if it exists) $dir_long = $url; - if (preg_match('/\\#/', $url)) { + if (preg_match('/\#/', $url)) { $link_type |= 0x08; } @@ -1050,11 +1050,11 @@ private function writeUrlExternal(int $row1, int $col1, int $row2, int $col2, st $link_type = pack('V', $link_type); // Calculate the up-level dir count e.g.. (..\..\..\ == 3) - $up_count = preg_match_all('/\\.\\.\\\\/', $dir_long, $useless); + $up_count = preg_match_all('/\.\.\\\/', $dir_long, $useless); $up_count = pack('v', $up_count); // Store the short dos dir name (null terminated) - $dir_short = (string) preg_replace('/\\.\\.\\\\/', '', $dir_long) . "\0"; + $dir_short = (string) preg_replace('/\.\.\\\/', '', $dir_long) . "\0"; // Store the long dir name as a wchar string (non-null terminated) //$dir_long = $dir_long . "\0"; diff --git a/tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCscTest.php b/tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCscTest.php index d694bc9d77..a282624f12 100644 --- a/tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCscTest.php +++ b/tests/PhpSpreadsheetTests/Calculation/Functions/Engineering/ImCscTest.php @@ -129,12 +129,12 @@ public function testImCscArray(array $expectedResult, string $complex): void // Avoid testing for excess precision foreach ($expectedResult as &$array) { foreach ($array as &$string) { - $string = preg_replace('/(\\d{8})\\d+/', '$1', $string); + $string = preg_replace('/(\d{8})\d+/', '$1', $string); } } foreach ($result as &$array) { foreach ($array as &$string) { - $string = preg_replace('/(\\d{8})\\d+/', '$1', $string); + $string = preg_replace('/(\d{8})\d+/', '$1', $string); } } diff --git a/tests/PhpSpreadsheetTests/IOFactoryTest.php b/tests/PhpSpreadsheetTests/IOFactoryTest.php index f123ae5009..9f6abd4fbe 100644 --- a/tests/PhpSpreadsheetTests/IOFactoryTest.php +++ b/tests/PhpSpreadsheetTests/IOFactoryTest.php @@ -194,21 +194,21 @@ public function testCreateReaderUnknownExtension(): void { $filename = 'samples/Reader2/sampleData/example1.tsv'; $reader = IOFactory::createReaderForFile($filename); - self::assertEquals('PhpOffice\\PhpSpreadsheet\\Reader\\Csv', $reader::class); + self::assertEquals('PhpOffice\PhpSpreadsheet\Reader\Csv', $reader::class); } public function testCreateReaderCsvExtension(): void { $filename = 'samples/Reader2/sampleData/example1.csv'; $reader = IOFactory::createReaderForFile($filename); - self::assertEquals('PhpOffice\\PhpSpreadsheet\\Reader\\Csv', $reader::class); + self::assertEquals('PhpOffice\PhpSpreadsheet\Reader\Csv', $reader::class); } public function testCreateReaderNoExtension(): void { $filename = 'samples/Reader/sampleData/example1xls'; $reader = IOFactory::createReaderForFile($filename); - self::assertEquals('PhpOffice\\PhpSpreadsheet\\Reader\\Xls', $reader::class); + self::assertEquals('PhpOffice\PhpSpreadsheet\Reader\Xls', $reader::class); } public function testCreateReaderNotSpreadsheet(): void diff --git a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php index 3f862cb99b..1384156787 100644 --- a/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Gnumeric/GnumericLoadTest.php @@ -31,10 +31,10 @@ public function testLoad(): void $props = $spreadsheet->getProperties(); self::assertEquals('Mark Baker', $props->getCreator()); $creationDate = $props->getCreated(); - $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\\TH:i:s\\Z', new DateTimeZone('UTC')); + $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\TH:i:s\Z', new DateTimeZone('UTC')); self::assertEquals('2010-09-02T20:48:39Z', $result); $creationDate = $props->getModified(); - $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\\TH:i:s\\Z', new DateTimeZone('UTC')); + $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\TH:i:s\Z', new DateTimeZone('UTC')); self::assertEquals('2020-06-05T05:15:21Z', $result); $sheet = $spreadsheet->getSheet(0); diff --git a/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php b/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php index 9299161f0e..21f9199273 100644 --- a/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Security/XmlScannerTest.php @@ -33,7 +33,7 @@ public static function providerValidXML(): array $expectedResult = (string) file_get_contents($file); if (preg_match('/UTF-16(LE|BE)?/', $file, $matches) == 1) { $expectedResult = (string) mb_convert_encoding($expectedResult, 'UTF-8', $matches[0]); - $expectedResult = preg_replace('/encoding\\s*=\\s*[\'"]UTF-\\d+(LE|BE)?[\'"]/', '', $expectedResult) ?? $expectedResult; + $expectedResult = preg_replace('/encoding\s*=\s*[\'"]UTF-\d+(LE|BE)?[\'"]/', '', $expectedResult) ?? $expectedResult; } $tests[basename($file)] = [$filename, $expectedResult]; } diff --git a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3730Test.php b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3730Test.php index db8ac2fd50..c83c4a0c4a 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3730Test.php +++ b/tests/PhpSpreadsheetTests/Reader/Xlsx/Issue3730Test.php @@ -14,7 +14,7 @@ public function testPreliminaries(): void { $file = 'zip://'; $file .= self::$testbook; - $file .= '#xl\\_rels\\workbook.xml.rels'; // no idea why backslash + $file .= '#xl\_rels\workbook.xml.rels'; // no idea why backslash $data = file_get_contents($file); // confirm that file contains expected absolute reference if ($data === false) { diff --git a/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php b/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php index beded2509e..6636bf521f 100644 --- a/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php +++ b/tests/PhpSpreadsheetTests/Reader/Xml/XmlLoadTest.php @@ -59,16 +59,16 @@ public function xtestLoad(): void $props = $spreadsheet->getProperties(); self::assertEquals('Mark Baker', $props->getCreator()); $creationDate = $props->getCreated(); - $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\\TH:i:s\\Z', new DateTimeZone('UTC')); + $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\TH:i:s\Z', new DateTimeZone('UTC')); self::assertEquals('2010-09-02T20:48:39Z', $result); $creationDate = $props->getModified(); - $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\\TH:i:s\\Z', new DateTimeZone('UTC')); + $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\TH:i:s\Z', new DateTimeZone('UTC')); self::assertEquals('2010-09-03T21:48:39Z', $result); self::assertEquals('AbCd1234', $props->getCustomPropertyValue('my_API_Token')); self::assertEquals('2', $props->getCustomPropertyValue('myŚInt')); /** @var string */ $creationDate = $props->getCustomPropertyValue('my_API_Token_Expiry'); - $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\\TH:i:s\\Z', new DateTimeZone('UTC')); + $result = Date::formattedDateTimeFromTimestamp("$creationDate", 'Y-m-d\TH:i:s\Z', new DateTimeZone('UTC')); self::assertEquals('2019-01-31T07:00:00Z', $result); $sheet = $spreadsheet->getSheet(0); diff --git a/tests/PhpSpreadsheetTests/Writer/Csv/CsvEnclosureTest.php b/tests/PhpSpreadsheetTests/Writer/Csv/CsvEnclosureTest.php index ffbdf453c1..c8a050412f 100644 --- a/tests/PhpSpreadsheetTests/Writer/Csv/CsvEnclosureTest.php +++ b/tests/PhpSpreadsheetTests/Writer/Csv/CsvEnclosureTest.php @@ -43,7 +43,7 @@ public function testNormalEnclosure(): void $filename = File::temporaryFilename(); $writer->save($filename); $filedata = self::getFileData($filename); - $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); + $filedata = preg_replace('/\r?\n/', $delimiter, $filedata); $reader = new CsvReader(); $reader->setDelimiter($delimiter); $reader->setEnclosure($enclosure); @@ -76,7 +76,7 @@ public function testNoEnclosure(): void $filename = File::temporaryFilename(); $writer->save($filename); $filedata = self::getFileData($filename); - $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); + $filedata = preg_replace('/\r?\n/', $delimiter, $filedata); $reader = new CsvReader(); $reader->setDelimiter($delimiter); $reader->setEnclosure($enclosure); @@ -109,7 +109,7 @@ public function testNotRequiredEnclosure1(): void $filename = File::temporaryFilename(); $writer->save($filename); $filedata = self::getFileData($filename); - $filedata = preg_replace('/\\r?\\n/', $delimiter, $filedata); + $filedata = preg_replace('/\r?\n/', $delimiter, $filedata); $reader = new CsvReader(); $reader->setDelimiter($delimiter); $reader->setEnclosure($enclosure); @@ -170,7 +170,7 @@ public function testNotRequiredEnclosure2(): void $filename = File::temporaryFilename(); $writer->save($filename); $filedata = self::getFileData($filename); - $filedata = preg_replace('/\\r/', '', $filedata); + $filedata = preg_replace('/\r/', '', $filedata); $reader = new CsvReader(); $reader->setDelimiter($delimiter); $reader->setEnclosure($enclosure); @@ -229,7 +229,7 @@ public function testRequiredEnclosure2(): void $filename = File::temporaryFilename(); $writer->save($filename); $filedata = self::getFileData($filename); - $filedata = preg_replace('/\\r/', '', $filedata); + $filedata = preg_replace('/\r/', '', $filedata); $reader = new CsvReader(); $reader->setDelimiter($delimiter); $reader->setEnclosure($enclosure); diff --git a/tests/PhpSpreadsheetTests/Writer/Html/InvalidFileNameTest.php b/tests/PhpSpreadsheetTests/Writer/Html/InvalidFileNameTest.php index e4621c58a3..aaf3ef0fad 100644 --- a/tests/PhpSpreadsheetTests/Writer/Html/InvalidFileNameTest.php +++ b/tests/PhpSpreadsheetTests/Writer/Html/InvalidFileNameTest.php @@ -57,7 +57,7 @@ public function testEmptyTempdirNamePdf(): void public function testWinFileNames(): void { - self::assertEquals('file:///C:/temp/filename.xlsx', Html::winFileToUrl('C:\\temp\filename.xlsx')); + self::assertEquals('file:///C:/temp/filename.xlsx', Html::winFileToUrl('C:\temp\filename.xlsx')); self::assertEquals('/tmp/filename.xlsx', Html::winFileToUrl('/tmp/filename.xlsx')); self::assertEquals('a:bfile', Html::winFileToUrl('a:bfile')); } diff --git a/tests/PhpSpreadsheetTests/Writer/Html/VisibilityTest.php b/tests/PhpSpreadsheetTests/Writer/Html/VisibilityTest.php index 75987f83a7..04ec57720f 100644 --- a/tests/PhpSpreadsheetTests/Writer/Html/VisibilityTest.php +++ b/tests/PhpSpreadsheetTests/Writer/Html/VisibilityTest.php @@ -28,13 +28,13 @@ public function testVisibility1(): void $sheet->getRowDimension(2)->setVisible(false); $writer = new Html($spreadsheet); $html = $writer->generateHTMLAll(); - $reg = '/^\\s*table[.]sheet0 tr { display:none; visibility:hidden }\\s*$/m'; + $reg = '/^\s*table[.]sheet0 tr { display:none; visibility:hidden }\s*$/m'; $rowsrch = preg_match($reg, $html); self::assertEquals($rowsrch, 0); - $reg = '/^\\s*table[.]sheet0 tr[.]row1 { display:none; visibility:hidden }\\s*$/m'; + $reg = '/^\s*table[.]sheet0 tr[.]row1 { display:none; visibility:hidden }\s*$/m'; $rowsrch = preg_match($reg, $html); self::assertEquals($rowsrch, 1); - $reg = '/^\\s*table[.]sheet0 [.]column1 [{] display:none [}]\\s*$/m'; + $reg = '/^\s*table[.]sheet0 [.]column1 [{] display:none [}]\s*$/m'; $colsrch = preg_match($reg, $html); self::assertEquals($colsrch, 1); @@ -61,13 +61,13 @@ public function testVisibility2(): void $writer = new Html($spreadsheet); $html = $writer->generateHTMLAll(); - $reg = '/^\\s*table[.]sheet0 tr { height:15pt; display:none; visibility:hidden }\\s*$/m'; + $reg = '/^\s*table[.]sheet0 tr { height:15pt; display:none; visibility:hidden }\s*$/m'; $rowsrch = preg_match($reg, $html); self::assertEquals($rowsrch, 1); - $reg = '/^\\s*table[.]sheet0 tr[.]row1 { display:none; visibility:hidden }\\s*$/m'; + $reg = '/^\s*table[.]sheet0 tr[.]row1 { display:none; visibility:hidden }\s*$/m'; $rowsrch = preg_match($reg, $html); self::assertEquals($rowsrch, 0); - $reg = '/^\\s*table[.]sheet0 [.]column1 [{] display:none [}]\\s*$/m'; + $reg = '/^\s*table[.]sheet0 [.]column1 [{] display:none [}]\s*$/m'; $colsrch = preg_match($reg, $html); self::assertEquals($colsrch, 1); @@ -97,15 +97,15 @@ public function testDefaultRowHeight(): void $html = $writer->generateHTMLAll(); self::assertEquals(1, substr_count($html, 'height:20pt')); self::assertEquals(1, substr_count($html, 'height:25pt')); - $rowsrch = preg_match('/^\\s*table[.]sheet0 tr [{] height:20pt [}]\\s*$/m', $html); + $rowsrch = preg_match('/^\s*table[.]sheet0 tr [{] height:20pt [}]\s*$/m', $html); self::assertEquals(1, $rowsrch); - $rowsrch = preg_match('/^\\s*table[.]sheet0 tr[.]row1 [{] height:25pt [}]\\s*$/m', $html); + $rowsrch = preg_match('/^\s*table[.]sheet0 tr[.]row1 [{] height:25pt [}]\s*$/m', $html); self::assertEquals(1, $rowsrch); - $rowsrch = preg_match('/^\\s*td[.]style1, th[.]style1 [{].*text-decoration:line-through;.*[}]\\s*$/m', $html); + $rowsrch = preg_match('/^\s*td[.]style1, th[.]style1 [{].*text-decoration:line-through;.*[}]\s*$/m', $html); self::assertEquals(1, $rowsrch); - $rowsrch = preg_match('/^\\s*td[.]style2, th[.]style2 [{].*text-decoration:underline line-through;.*[}]\\s*$/m', $html); + $rowsrch = preg_match('/^\s*td[.]style2, th[.]style2 [{].*text-decoration:underline line-through;.*[}]\s*$/m', $html); self::assertEquals(1, $rowsrch); - $rowsrch = preg_match('/^\\s*td[.]style3, th[.]style3 [{].*text-decoration:underline;.*[}]\\s*$/m', $html); + $rowsrch = preg_match('/^\s*td[.]style3, th[.]style3 [{].*text-decoration:underline;.*[}]\s*$/m', $html); self::assertEquals(1, $rowsrch); $this->writeAndReload($spreadsheet, 'Html'); diff --git a/tests/PhpSpreadsheetTests/Writer/Html/XssVulnerabilityTest.php b/tests/PhpSpreadsheetTests/Writer/Html/XssVulnerabilityTest.php index 4bc99e65e4..a4953faeed 100644 --- a/tests/PhpSpreadsheetTests/Writer/Html/XssVulnerabilityTest.php +++ b/tests/PhpSpreadsheetTests/Writer/Html/XssVulnerabilityTest.php @@ -20,7 +20,7 @@ public static function providerXssRichText(): array 'script tag with quotes' => ['Hello, I am trying to your site', 'Hello, I am trying to <script>alert("Hack");</script> your site'], 'javascript tag no hex' => ["CLICK", "<a href='javascript:alert(1)'>CLICK</a>"], 'javascript tag' => ["CLICK", "<a href='&#x2000;javascript:alert(1)'>CLICK</a>"], - 'with unicode' => ['CLICK', '<a href="\\u0001java\\u0003script:alert(1)">CLICK</a>'], + 'with unicode' => ['CLICK', '<a href="\u0001java\u0003script:alert(1)">CLICK</a>'], 'inline css' => ['
  • ', '<li style="list-style-image: url(javascript:alert(0))">'], 'char value chevron' => ["\x3cscript src=http://www.example.com/malicious-code.js\x3e\x3c/script\x3e", '<script src=http://www.example.com/malicious-code.js></script>'], 'hexadecimal html' => ['', '<IMG SRC=&#106&#x61&#x76&#x61&#x73&#109&#x72&#x69&#x70&#x74&#x3A&#x61&#x6C&#x65&#x72&#x74&#x28&#x27&#x58&#x53&#x53&#x27&#x29>'], diff --git a/tests/data/Calculation/TextData/TEXTJOIN.php b/tests/data/Calculation/TextData/TEXTJOIN.php index 3908abb875..9f59163593 100644 --- a/tests/data/Calculation/TextData/TEXTJOIN.php +++ b/tests/data/Calculation/TextData/TEXTJOIN.php @@ -54,7 +54,7 @@ ['-', false, 'Boolean', '', true], ], [ - 'C:\\Users\\Mark\\Documents\\notes.doc', + 'C:\Users\Mark\Documents\notes.doc', ['\\', true, 'C:', 'Users', 'Mark', 'Documents', 'notes.doc'], ], 'no argument' => ['exception', []], diff --git a/tests/data/Style/NumberFormatDates.php b/tests/data/Style/NumberFormatDates.php index c1f8eb1b8a..477deba73f 100644 --- a/tests/data/Style/NumberFormatDates.php +++ b/tests/data/Style/NumberFormatDates.php @@ -18,13 +18,13 @@ [ '1960-12-19T01:30:00', 22269.0625, - 'yyyy-mm-dd\\Thh:mm:ss', + 'yyyy-mm-dd\Thh:mm:ss', ], // Date with plaintext in quotes [ '1960-12-19T01:30:00 Z', 22269.0625, - 'yyyy-mm-dd"T"hh:mm:ss \\Z', + 'yyyy-mm-dd"T"hh:mm:ss \Z', ], // Date with quoted formatting characters [