From ff8f80104356721fe188635ec80132e95a826091 Mon Sep 17 00:00:00 2001 From: MarkBaker Date: Wed, 25 May 2022 13:32:06 +0200 Subject: [PATCH] Use preg_replace() with arrays, where appropriate, because it's more efficient that caling several times --- .../Reader/Ods/FormulaTranslator.php | 49 ++++++++++++------- src/PhpSpreadsheet/Writer/Xls/Parser.php | 3 +- src/PhpSpreadsheet/Writer/Xls/Worksheet.php | 3 +- 3 files changed, 34 insertions(+), 21 deletions(-) diff --git a/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php b/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php index 7ba380e9..4abdf11e 100644 --- a/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php +++ b/src/PhpSpreadsheet/Reader/Ods/FormulaTranslator.php @@ -13,15 +13,23 @@ class FormulaTranslator // Cell range 3-d reference // As we don't support 3-d ranges, we're just going to take a quick and dirty approach // and assume that the second worksheet reference is the same as the first - $excelAddress = (string) preg_replace('/\$?([^\.]+)\.([^\.]+):\$?([^\.]+)\.([^\.]+)/miu', '$1!$2:$4', $excelAddress); - // Cell range reference in another sheet - $excelAddress = (string) preg_replace('/\$?([^\.]+)\.([^\.]+):\.([^\.]+)/miu', '$1!$2:$3', $excelAddress); - // Cell reference in another sheet - $excelAddress = (string) preg_replace('/\$?([^\.]+)\.([^\.]+)/miu', '$1!$2', $excelAddress); - // Cell range reference - $excelAddress = (string) preg_replace('/\.([^\.]+):\.([^\.]+)/miu', '$1:$2', $excelAddress); - // Simple cell reference - $excelAddress = (string) preg_replace('/\.([^\.]+)/miu', '$1', $excelAddress); + $excelAddress = (string) preg_replace( + [ + '/\$?([^\.]+)\.([^\.]+):\$?([^\.]+)\.([^\.]+)/miu', + '/\$?([^\.]+)\.([^\.]+):\.([^\.]+)/miu', // Cell range reference in another sheet + '/\$?([^\.]+)\.([^\.]+)/miu', // Cell reference in another sheet + '/\.([^\.]+):\.([^\.]+)/miu', // Cell range reference + '/\.([^\.]+)/miu', // Simple cell reference + ], + [ + '$1!$2:$4', + '$1!$2:$3', + '$1!$2', + '$1:$2', + '$1', + ], + $excelAddress + ); return $excelAddress; } @@ -37,14 +45,21 @@ class FormulaTranslator // Only replace in alternate array entries (i.e. non-quoted blocks) // so that conversion isn't done in string values if ($tKey = !$tKey) { - // Cell range reference in another sheet - $value = (string) preg_replace('/\[\$?([^\.]+)\.([^\.]+):\.([^\.]+)\]/miu', '$1!$2:$3', $value); - // Cell reference in another sheet - $value = (string) preg_replace('/\[\$?([^\.]+)\.([^\.]+)\]/miu', '$1!$2', $value); - // Cell range reference - $value = (string) preg_replace('/\[\.([^\.]+):\.([^\.]+)\]/miu', '$1:$2', $value); - // Simple cell reference - $value = (string) preg_replace('/\[\.([^\.]+)\]/miu', '$1', $value); + $value = (string) preg_replace( + [ + '/\[\$?([^\.]+)\.([^\.]+):\.([^\.]+)\]/miu', // Cell range reference in another sheet + '/\[\$?([^\.]+)\.([^\.]+)\]/miu', // Cell reference in another sheet + '/\[\.([^\.]+):\.([^\.]+)\]/miu', // Cell range reference + '/\[\.([^\.]+)\]/miu', // Simple cell reference + ], + [ + '$1!$2:$3', + '$1!$2', + '$1:$2', + '$1', + ], + $value + ); // Convert references to defined names/formulae $value = str_replace('$$', '', $value); diff --git a/src/PhpSpreadsheet/Writer/Xls/Parser.php b/src/PhpSpreadsheet/Writer/Xls/Parser.php index 618b639d..2f75f908 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Parser.php +++ b/src/PhpSpreadsheet/Writer/Xls/Parser.php @@ -778,8 +778,7 @@ class Parser */ private function getRefIndex($ext_ref) { - $ext_ref = (string) preg_replace("/^'/", '', $ext_ref); // Remove leading ' if any. - $ext_ref = (string) preg_replace("/'$/", '', $ext_ref); // Remove trailing ' if any. + $ext_ref = (string) preg_replace(["/^'/", "/'$/"], ['', ''], $ext_ref); // Remove leading and trailing ' if any. $ext_ref = str_replace('\'\'', '\'', $ext_ref); // Replace escaped '' with ' // Check if there is a sheet range eg., Sheet1:Sheet2. diff --git a/src/PhpSpreadsheet/Writer/Xls/Worksheet.php b/src/PhpSpreadsheet/Writer/Xls/Worksheet.php index 6c1c97cb..37865518 100644 --- a/src/PhpSpreadsheet/Writer/Xls/Worksheet.php +++ b/src/PhpSpreadsheet/Writer/Xls/Worksheet.php @@ -1095,8 +1095,7 @@ class Worksheet extends BIFFwriter // Strip URL type and change Unix dir separator to Dos style (if needed) // - $url = (string) preg_replace('/^external:/', '', $url); - $url = (string) preg_replace('/\//', '\\', $url); + $url = (string) preg_replace(['/^external:/', '/\//'], ['', '\\'], $url); // Determine if the link is relative or absolute: // relative if link contains no dir separator, "somefile.xls"