[TASK] Replace substr(...) with strpos(...) 66/57466/8
authorWouter Wolters <typo3@wouterwolters.nl>
Wed, 4 Jul 2018 18:13:44 +0000 (20:13 +0200)
committerChristian Kuhn <lolli@schwarzbu.ch>
Sun, 2 Sep 2018 10:48:10 +0000 (12:48 +0200)
strpos will use only CPU resources, substr also needs memory allocation.

Resolves: #85477
Releases: master
Change-Id: Ic25c99986f7e2e7237c10acaa75be8d0f6289f13
Reviewed-on: https://review.typo3.org/57466
Reviewed-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: Jigal van Hemert <jigal.van.hemert@typo3.org>
Tested-by: TYPO3com <no-reply@typo3.com>
Reviewed-by: Christian Kuhn <lolli@schwarzbu.ch>
Tested-by: Christian Kuhn <lolli@schwarzbu.ch>
51 files changed:
typo3/sysext/backend/Classes/Controller/NewRecordController.php
typo3/sysext/backend/Classes/Controller/Wizard/AddController.php
typo3/sysext/backend/Classes/Controller/Wizard/ListController.php
typo3/sysext/backend/Classes/Domain/Repository/TableManualRepository.php
typo3/sysext/backend/Classes/Form/Container/FullRecordContainer.php
typo3/sysext/backend/Classes/Form/Container/InlineRecordContainer.php
typo3/sysext/backend/Classes/Tree/View/PagePositionMap.php
typo3/sysext/backend/Classes/Utility/BackendUtility.php
typo3/sysext/backend/Classes/View/PageLayoutView.php
typo3/sysext/belog/Classes/Domain/Repository/LogEntryRepository.php
typo3/sysext/core/Classes/Authentication/AbstractUserAuthentication.php
typo3/sysext/core/Classes/Cache/Backend/MemcachedBackend.php
typo3/sysext/core/Classes/Cache/Backend/PdoBackend.php
typo3/sysext/core/Classes/Cache/Backend/SimpleFileBackend.php
typo3/sysext/core/Classes/Compatibility/LoadedExtensionArrayElement.php
typo3/sysext/core/Classes/Configuration/Loader/YamlFileLoader.php
typo3/sysext/core/Classes/Database/PdoHelper.php
typo3/sysext/core/Classes/Database/QueryGenerator.php
typo3/sysext/core/Classes/Database/QueryView.php
typo3/sysext/core/Classes/Html/RteHtmlParser.php
typo3/sysext/core/Classes/Migrations/TcaMigration.php
typo3/sysext/core/Classes/Package/PackageManager.php
typo3/sysext/core/Classes/Resource/Driver/AbstractHierarchicalFilesystemDriver.php
typo3/sysext/core/Classes/TypoScript/ExtendedTemplateService.php
typo3/sysext/core/Classes/TypoScript/TemplateService.php
typo3/sysext/core/Classes/Utility/ClassNamingUtility.php
typo3/sysext/core/Classes/Utility/GeneralUtility.php
typo3/sysext/core/Resources/PHP/ClassMapGenerator.php
typo3/sysext/core/Tests/Unit/LinkHandling/LegacyLinkNotationConverterTest.php
typo3/sysext/extbase/Classes/Mvc/Controller/Arguments.php
typo3/sysext/extbase/Classes/Mvc/Web/Response.php
typo3/sysext/extbase/Classes/Persistence/Repository.php
typo3/sysext/extbase/Classes/Reflection/ObjectAccess.php
typo3/sysext/extbase/Classes/Service/ImageService.php
typo3/sysext/fluid/Classes/ViewHelpers/Be/Labels/CshViewHelper.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/frontend/Classes/Typolink/PageLinkBuilder.php
typo3/sysext/impexp/Classes/Import.php
typo3/sysext/indexed_search/Classes/Controller/SearchController.php
typo3/sysext/indexed_search/Classes/Domain/Repository/IndexSearchRepository.php
typo3/sysext/indexed_search/Classes/Indexer.php
typo3/sysext/install/Classes/Controller/InstallerController.php
typo3/sysext/install/Classes/Controller/UpgradeController.php
typo3/sysext/install/Classes/SystemEnvironment/Check.php
typo3/sysext/lowlevel/Classes/Controller/DatabaseIntegrityController.php
typo3/sysext/reports/Classes/Report/Status/ConfigurationStatus.php
typo3/sysext/rsaauth/Classes/Backend/CommandLineBackend.php
typo3/sysext/rsaauth/Classes/BackendWarnings.php
typo3/sysext/rsaauth/Classes/RsaAuthService.php
typo3/sysext/setup/Classes/Controller/SetupModuleController.php
typo3/sysext/sys_action/Classes/ActionTask.php

index da8bd7d..c84f0a8 100644 (file)
@@ -723,7 +723,7 @@ class NewRecordController
                             $_EXTKEY = '';
                             if ($nameParts[0] === 'tx' || $nameParts[0] === 'tt') {
                                 // Try to extract extension name
-                                if (substr($v['ctrl']['title'], 0, 8) === 'LLL:EXT:') {
+                                if (strpos($v['ctrl']['title'], 'LLL:EXT:') === 0) {
                                     $_EXTKEY = substr($v['ctrl']['title'], 8);
                                     $_EXTKEY = substr($_EXTKEY, 0, strpos($_EXTKEY, '/'));
                                     if ($_EXTKEY !== '') {
index 77c51d7..fb98d13 100644 (file)
@@ -158,7 +158,7 @@ class AddController extends AbstractWizardController
             is_array($record) ? $record : ['pid' => $this->P['pid']]
         );
         // Set [params][pid]
-        if (substr($this->P['params']['pid'], 0, 3) === '###' && substr($this->P['params']['pid'], -3) === '###') {
+        if (strpos($this->P['params']['pid'], '###') === 0 && substr($this->P['params']['pid'], -3) === '###') {
             $keyword = substr($this->P['params']['pid'], 3, -3);
             if (strpos($keyword, 'PAGE_TSCONFIG_') === 0) {
                 $this->pid = (int)$TSconfig[$this->P['field']][$keyword];
index 71268f0..eb0a377 100644 (file)
@@ -123,7 +123,7 @@ class ListController extends AbstractWizardController
             is_array($origRow) ? $origRow : ['pid' => $this->P['pid']]
         );
         // Set [params][pid]
-        if (substr($this->P['params']['pid'], 0, 3) === '###' && substr($this->P['params']['pid'], -3) === '###') {
+        if (strpos($this->P['params']['pid'], '###') === 0 && substr($this->P['params']['pid'], -3) === '###') {
             $keyword = substr($this->P['params']['pid'], 3, -3);
             if (strpos($keyword, 'PAGE_TSCONFIG_') === 0) {
                 $this->pid = (int)$TSconfig[$this->P['field']][$keyword];
index 1089443..e4441fe 100644 (file)
@@ -259,14 +259,14 @@ class TableManualRepository
             if ($itemValue) {
                 $reference = GeneralUtility::trimExplode(':', $itemValue);
                 $referenceUrl = GeneralUtility::trimExplode('|', $itemValue);
-                if (substr($referenceUrl[1], 0, 4) === 'http') {
+                if (strpos($referenceUrl[1], 'http') === 0) {
                     // URL reference
                     $lines[] = [
                         'url' => $referenceUrl[1],
                         'title' => $referenceUrl[0],
                         'target' => '_blank'
                     ];
-                } elseif (substr($referenceUrl[1], 0, 5) === 'FILE:') {
+                } elseif (strpos($referenceUrl[1], 'FILE:') === 0) {
                     // File reference
                     $fileName = GeneralUtility::getFileAbsFileName(substr($referenceUrl[1], 5));
                     if ($fileName && @is_file($fileName)) {
index da3dd30..c5f01e5 100644 (file)
@@ -50,7 +50,7 @@ class FullRecordContainer extends AbstractContainer
 
         // Streamline the fields array
         // First, make sure there is always a --div-- definition for the first element
-        if (substr($fieldsArray[0], 0, 7) !== '--div--') {
+        if (strpos($fieldsArray[0], '--div--') !== 0) {
             array_unshift($fieldsArray, '--div--;LLL:EXT:core/Resources/Private/Language/locallang_core.xlf:labels.generalTab');
         }
         // If first tab has no label definition, add "general" label
@@ -61,7 +61,7 @@ class FullRecordContainer extends AbstractContainer
         // If there are at least two --div-- definitions, inner container will be a TabContainer, else a NoTabContainer
         $tabCount = 0;
         foreach ($fieldsArray as $field) {
-            if (substr($field, 0, 7) === '--div--') {
+            if (strpos($field, '--div--') === 0) {
                 $tabCount++;
             }
         }
index 90d9d13..75e9bab 100644 (file)
@@ -399,7 +399,7 @@ class InlineRecordContainer extends AbstractContainer
             'localize' => '',
             'locked' => '',
         ];
-        $isNewItem = substr($rec['uid'], 0, 3) === 'NEW';
+        $isNewItem = strpos($rec['uid'], 'NEW') === 0;
         $isParentExisting = MathUtility::canBeInterpretedAsInteger($data['inlineParentUid']);
         $tcaTableCtrl = $GLOBALS['TCA'][$foreignTable]['ctrl'];
         $tcaTableCols = $GLOBALS['TCA'][$foreignTable]['columns'];
index 314b8f0..56ba894 100644 (file)
@@ -252,7 +252,7 @@ class PagePositionMap
         $code = '<ul class="list-tree">';
 
         foreach ($lines as $line) {
-            if ((substr($line, 0, 3) === '<ul') || (substr($line, 0, 4) === '</ul')) {
+            if ((strpos($line, '<ul') === 0) || (strpos($line, '</ul') === 0)) {
                 $code .= $line;
             } else {
                 $code .= '<li>' . $line . '</li>';
index 161c997..8881623 100644 (file)
@@ -558,7 +558,7 @@ class BackendUtility
         }
         $output = $fullOutput = '/';
         $clause = trim($clause);
-        if ($clause !== '' && substr($clause, 0, 3) !== 'AND') {
+        if ($clause !== '' && strpos($clause, 'AND') !== 0) {
             $clause = 'AND ' . $clause;
         }
         $data = self::BEgetRootLine($uid, $clause);
index c461b7d..b331954 100644 (file)
@@ -807,7 +807,7 @@ class PageLayoutView implements LoggerAwareInterface
                         $theData[$field] = '&nbsp;<strong>ID</strong>';
                         break;
                     default:
-                        if (substr($field, 0, 6) === 'table_') {
+                        if (strpos($field, 'table_') === 0) {
                             $f2 = substr($field, 6);
                             if ($GLOBALS['TCA'][$f2]) {
                                 $theData[$field] = '&nbsp;' .
@@ -1816,7 +1816,7 @@ class PageLayoutView implements LoggerAwareInterface
                     }
                     break;
                 default:
-                    if (substr($field, 0, 6) === 'table_') {
+                    if (strpos($field, 'table_') === 0) {
                         $f2 = substr($field, 6);
                         if ($GLOBALS['TCA'][$f2]) {
                             $c = $this->numberOfRecords($f2, $row['uid']);
index a31e22d..6cb29f4 100644 (file)
@@ -134,7 +134,7 @@ class LogEntryRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
             return;
         }
         // Constraint for a group
-        if (substr($userOrGroup, 0, 3) === 'gr-') {
+        if (strpos($userOrGroup, 'gr-') === 0) {
             $groupId = (int)substr($userOrGroup, 3);
             $userIds = [];
             foreach ($this->beUserList as $userId => $userData) {
@@ -148,7 +148,7 @@ class LogEntryRepository extends \TYPO3\CMS\Extbase\Persistence\Repository
                 // If there are no group members -> use -1 as constraint to not find anything
                 $queryConstraints[] = $query->in('userid', [-1]);
             }
-        } elseif (substr($userOrGroup, 0, 3) === 'us-') {
+        } elseif (strpos($userOrGroup, 'us-') === 0) {
             $queryConstraints[] = $query->equals('userid', (int)substr($userOrGroup, 3));
         } elseif ($userOrGroup === '-1') {
             $queryConstraints[] = $query->equals('userid', (int)$GLOBALS['BE_USER']->user['uid']);
index 86ed588..e67da94 100644 (file)
@@ -632,7 +632,7 @@ abstract class AbstractUserAuthentication implements LoggerAwareInterface
             }
             // Refuse login for _CLI users, if not processing a CLI request type
             // (although we shouldn't be here in case of a CLI request type)
-            if (strtoupper(substr($loginData['uname'], 0, 5)) === '_CLI_' && !Environment::isCli()) {
+            if (stripos($loginData['uname'], '_CLI_') === 0 && !Environment::isCli()) {
                 throw new \RuntimeException('TYPO3 Fatal Error: You have tried to login using a CLI user. Access prohibited!', 1270853931);
             }
         }
index 00fc15b..cd9eac6 100644 (file)
@@ -165,11 +165,11 @@ class MemcachedBackend extends AbstractBackend implements TaggableBackendInterfa
         $this->memcache = new $memcachedPlugin;
         $defaultPort = $this->usedPeclModule === 'memcache' ? ini_get('memcache.default_port') : 11211;
         foreach ($this->servers as $server) {
-            if (substr($server, 0, 7) === 'unix://') {
+            if (strpos($server, 'unix://') === 0) {
                 $host = $server;
                 $port = 0;
             } else {
-                if (substr($server, 0, 6) === 'tcp://') {
+                if (strpos($server, 'tcp://') === 0) {
                     $server = substr($server, 6);
                 }
                 if (strpos($server, ':') !== false) {
@@ -290,7 +290,7 @@ class MemcachedBackend extends AbstractBackend implements TaggableBackendInterfa
     public function get($entryIdentifier)
     {
         $value = $this->memcache->get($this->identifierPrefix . $entryIdentifier);
-        if (is_string($value) && substr($value, 0, 14) === 'TYPO3*chunked:') {
+        if (is_string($value) && strpos($value, 'TYPO3*chunked:') === 0) {
             list(, $chunkCount) = explode(':', $value);
             $value = '';
             for ($chunkNumber = 1; $chunkNumber < $chunkCount; $chunkNumber++) {
index 64f740b..7bd53bc 100644 (file)
@@ -256,7 +256,7 @@ class PdoBackend extends AbstractBackend implements TaggableBackendInterface
                 $this->databaseHandle = GeneralUtility::makeInstance(\PDO::class, $this->dataSourceName, $this->username, $this->password);
             }
             $this->databaseHandle->setAttribute(\PDO::ATTR_ERRMODE, \PDO::ERRMODE_EXCEPTION);
-            if (substr($this->pdoDriver, 0, 5) === 'mysql') {
+            if (strpos($this->pdoDriver, 'mysql') === 0) {
                 $this->databaseHandle->exec('SET SESSION sql_mode=\'ANSI\';');
             }
         } catch (\PDOException $e) {
@@ -298,7 +298,7 @@ class PdoBackend extends AbstractBackend implements TaggableBackendInterface
     {
         $sql = file($pathAndFilename, FILE_IGNORE_NEW_LINES & FILE_SKIP_EMPTY_LINES);
         // Remove MySQL style key length delimiters (yuck!) if we are not setting up a MySQL db
-        if (substr($pdoDriver, 0, 5) !== 'mysql') {
+        if (strpos($pdoDriver, 'mysql') !== 0) {
             $sql = preg_replace('/"\\([0-9]+\\)/', '"', $sql);
         }
         $statement = '';
index ea4ff39..b107b47 100644 (file)
@@ -164,7 +164,7 @@ class SimpleFileBackend extends AbstractBackend implements PhpCapableBackendInte
                 $documentRoot = '';
             }
             if (Environment::isWindows()) {
-                if (substr($cacheDirectory, 0, strlen($documentRoot)) === $documentRoot) {
+                if (strpos($cacheDirectory, $documentRoot) === 0) {
                     $documentRoot = '';
                 }
             }
index 84e9361..177b340 100644 (file)
@@ -69,7 +69,7 @@ class LoadedExtensionArrayElement implements \IteratorAggregate, \ArrayAccess, \
         $pathSite = Environment::getPublicPath() . '/';
         $pathSiteLength = strlen($pathSite);
         $absolutePackagePath = $this->package->getPackagePath();
-        if (substr($absolutePackagePath, 0, $pathSiteLength) === $pathSite) {
+        if (strpos($absolutePackagePath, $pathSite) === 0) {
             $relativePackagePathToPathSite = substr($absolutePackagePath, $pathSiteLength);
             $relativePackagePathToPathSiteSegments = explode('/', $relativePackagePathToPathSite);
             $packageType = null;
index aebe666..5491d5c 100644 (file)
@@ -151,7 +151,7 @@ class YamlFileLoader
      */
     protected function isPlaceholder($value): bool
     {
-        return is_string($value) && substr($value, 0, 1) === '%' && substr($value, -1) === '%';
+        return is_string($value) && strpos($value, '%') === 0 && substr($value, -1) === '%';
     }
 
     /**
index 2e53a1f..ab2b4cd 100644 (file)
@@ -38,7 +38,7 @@ class PdoHelper
         trigger_error('Class will be removed in TYPO3 v10', E_USER_DEPRECATED);
         $sql = file($pathAndFilename, FILE_IGNORE_NEW_LINES & FILE_SKIP_EMPTY_LINES);
         // Remove MySQL style key length delimiters (yuck!) if we are not setting up a MySQL db
-        if (substr($pdoDriver, 0, 5) !== 'mysql') {
+        if (strpos($pdoDriver, 'mysql') !== 0) {
             $sql = preg_replace('/"\\([0-9]+\\)/', '"', $sql);
         }
         $statement = '';
index 5116720..64e991c 100644 (file)
@@ -555,7 +555,7 @@ class QueryGenerator
         // Traverse:
         foreach ($queryConfig as $key => $conf) {
             $fieldName = '';
-            if (substr($conf['type'], 0, 6) === 'FIELD_') {
+            if (strpos($conf['type'], 'FIELD_') === 0) {
                 $fieldName = substr($conf['type'], 6);
                 $fieldType = $this->fields[$fieldName]['type'];
             } elseif ($conf['type'] === 'newlevel') {
@@ -610,7 +610,7 @@ class QueryGenerator
             $subscript = $parent . '[' . $key . ']';
             $lineHTML = [];
             $lineHTML[] = $this->mkOperatorSelect($this->name . $subscript, $conf['operator'], $c, $conf['type'] !== 'FIELD_');
-            if (substr($conf['type'], 0, 6) === 'FIELD_') {
+            if (strpos($conf['type'], 'FIELD_') === 0) {
                 $fieldName = substr($conf['type'], 6);
                 $this->fieldName = $fieldName;
                 $fieldType = $this->fields[$fieldName]['type'];
@@ -811,7 +811,7 @@ class QueryGenerator
         }
         if ($fieldSetup['type'] === 'multiple') {
             foreach ($fieldSetup['items'] as $key => $val) {
-                if (substr($val[0], 0, 4) === 'LLL:') {
+                if (strpos($val[0], 'LLL:') === 0) {
                     $value = $languageService->sL($val[0]);
                 } else {
                     $value = $val[0];
@@ -825,7 +825,7 @@ class QueryGenerator
         }
         if ($fieldSetup['type'] === 'binary') {
             foreach ($fieldSetup['items'] as $key => $val) {
-                if (substr($val[0], 0, 4) === 'LLL:') {
+                if (strpos($val[0], 'LLL:') === 0) {
                     $value = $languageService->sL($val[0]);
                 } else {
                     $value = $val[0];
@@ -842,7 +842,7 @@ class QueryGenerator
             $dontPrefixFirstTable = 0;
             if ($fieldSetup['items']) {
                 foreach ($fieldSetup['items'] as $key => $val) {
-                    if (substr($val[0], 0, 4) === 'LLL:') {
+                    if (strpos($val[0], 'LLL:') === 0) {
                         $value = $languageService->sL($val[0]);
                     } else {
                         $value = $val[0];
@@ -906,7 +906,7 @@ class QueryGenerator
                     $altLabelField = $GLOBALS['TCA'][$from_table]['ctrl']['label_alt'];
                     if ($GLOBALS['TCA'][$from_table]['columns'][$labelField]['config']['items']) {
                         foreach ($GLOBALS['TCA'][$from_table]['columns'][$labelField]['config']['items'] as $labelArray) {
-                            if (substr($labelArray[0], 0, 4) === 'LLL:') {
+                            if (strpos($labelArray[0], 'LLL:') === 0) {
                                 $labelFieldSelect[$labelArray[1]] = $languageService->sL($labelArray[0]);
                             } else {
                                 $labelFieldSelect[$labelArray[1]] = $labelArray[0];
@@ -917,7 +917,7 @@ class QueryGenerator
                     $altLabelFieldSelect = [];
                     if ($GLOBALS['TCA'][$from_table]['columns'][$altLabelField]['config']['items']) {
                         foreach ($GLOBALS['TCA'][$from_table]['columns'][$altLabelField]['config']['items'] as $altLabelArray) {
-                            if (substr($altLabelArray[0], 0, 4) === 'LLL:') {
+                            if (strpos($altLabelArray[0], 'LLL:') === 0) {
                                 $altLabelFieldSelect[$altLabelArray[1]] = $languageService->sL($altLabelArray[0]);
                             } else {
                                 $altLabelFieldSelect[$altLabelArray[1]] = $altLabelArray[0];
index 2a999d3..ee176a5 100644 (file)
@@ -957,7 +957,7 @@ class QueryView
         }
         if ($fieldSetup['type'] === 'multiple') {
             foreach ($fieldSetup['items'] as $key => $val) {
-                if (substr($val[0], 0, 4) === 'LLL:') {
+                if (strpos($val[0], 'LLL:') === 0) {
                     $value = $this->languageService->sL($val[0]);
                 } else {
                     $value = $val[0];
@@ -972,7 +972,7 @@ class QueryView
         }
         if ($fieldSetup['type'] === 'binary') {
             foreach ($fieldSetup['items'] as $Key => $val) {
-                if (substr($val[0], 0, 4) === 'LLL:') {
+                if (strpos($val[0], 'LLL:') === 0) {
                     $value = $this->languageService->sL($val[0]);
                 } else {
                     $value = $val[0];
@@ -988,7 +988,7 @@ class QueryView
             $useTablePrefix = 0;
             if ($fieldSetup['items']) {
                 foreach ($fieldSetup['items'] as $key => $val) {
-                    if (substr($val[0], 0, 4) === 'LLL:') {
+                    if (strpos($val[0], 'LLL:') === 0) {
                         $value = $this->languageService->sL($val[0]);
                     } else {
                         $value = $val[0];
@@ -1049,7 +1049,7 @@ class QueryView
                     if ($GLOBALS['TCA'][$from_table]['columns'][$labelField]['config']['items']) {
                         $items = $GLOBALS['TCA'][$from_table]['columns'][$labelField]['config']['items'];
                         foreach ($items as $labelArray) {
-                            if (substr($labelArray[0], 0, 4) === 'LLL:') {
+                            if (strpos($labelArray[0], 'LLL:') === 0) {
                                 $labelFieldSelect[$labelArray[1]] = $this->languageService->sL($labelArray[0]);
                             } else {
                                 $labelFieldSelect[$labelArray[1]] = $labelArray[0];
@@ -1061,7 +1061,7 @@ class QueryView
                     if ($GLOBALS['TCA'][$from_table]['columns'][$altLabelField]['config']['items']) {
                         $items = $GLOBALS['TCA'][$from_table]['columns'][$altLabelField]['config']['items'];
                         foreach ($items as $altLabelArray) {
-                            if (substr($altLabelArray[0], 0, 4) === 'LLL:') {
+                            if (strpos($altLabelArray[0], 'LLL:') === 0) {
                                 $altLabelFieldSelect[$altLabelArray[1]] = $this->languageService->sL($altLabelArray[0]);
                             } else {
                                 $altLabelFieldSelect[$altLabelArray[1]] = $altLabelArray[0];
index 0d23a71..063b4d7 100644 (file)
@@ -514,7 +514,7 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
                     list($attribArray) = $this->get_tag_attributes($v, true);
                     $absoluteUrl = trim($attribArray['src']);
                     // Transform the src attribute into an absolute url, if it not already
-                    if (strtolower(substr($absoluteUrl, 0, 4)) !== 'http') {
+                    if (stripos($absoluteUrl, 'http') !== 0) {
                         // If site is in a subpath (eg. /~user_jim/) this path needs to be removed because it will be added with $siteUrl
                         $attribArray['src'] = preg_replace('#^' . preg_quote($sitePath, '#') . '#', '', $attribArray['src']);
                         $attribArray['src'] = $siteUrl . $attribArray['src'];
@@ -995,8 +995,8 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
             // Wrapping the line in <p> tags if not already wrapped and does not contain an hr tag
             if (!preg_match('/<(hr)(\\s[^>\\/]*)?[[:space:]]*\\/?>/i', $parts[$k])) {
                 $testStr = strtolower(trim($parts[$k]));
-                if (substr($testStr, 0, 4) !== '<div' || substr($testStr, -6) !== '</div>') {
-                    if (substr($testStr, 0, 2) !== '<p' || substr($testStr, -4) !== '</p>') {
+                if (strpos($testStr, '<div') !== 0 || substr($testStr, -6) !== '</div>') {
+                    if (strpos($testStr, '<p') !== 0 || substr($testStr, -4) !== '</p>') {
                         // Only set p-tags if there is not already div or p tags:
                         $parts[$k] = '<p>' . $parts[$k] . '</p>';
                     }
@@ -1107,7 +1107,7 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
     {
         $info = [];
         $url = trim($url);
-        if (substr(strtolower($url), 0, 7) === 'mailto:') {
+        if (strpos(strtolower($url), 'mailto:') === 0) {
             $info['url'] = trim(substr($url, 7));
             $info['type'] = 'email';
         } elseif (strpos($url, '?file:') !== false) {
@@ -1129,7 +1129,7 @@ class RteHtmlParser extends HtmlParser implements LoggerAwareInterface
             $siteUrl_parts = parse_url($url);
             $curUrl_parts = parse_url($curURL);
             // Hosts should match
-            if ($siteUrl_parts['host'] == $curUrl_parts['host'] && (!$info['relScriptPath'] || defined('TYPO3_mainDir') && substr($info['relScriptPath'], 0, strlen(TYPO3_mainDir)) == TYPO3_mainDir)) {
+            if ($siteUrl_parts['host'] == $curUrl_parts['host'] && (!$info['relScriptPath'] || defined('TYPO3_mainDir') && strpos($info['relScriptPath'], TYPO3_mainDir) === 0)) {
                 // If the script path seems to match or is empty (FE-EDIT)
                 // New processing order 100502
                 $uP = parse_url($info['relUrl']);
index 9b28e5e..76f9716 100644 (file)
@@ -329,7 +329,7 @@ class TcaMigration
                                 $newDefaultExtrasArray = [];
                                 foreach ($defaultExtrasArray as $fieldExtraField) {
                                     // There might be multiple enabled wizards separated by | ... split them
-                                    if (substr($fieldExtraField, 0, 8) === 'wizards[') {
+                                    if (strpos($fieldExtraField, 'wizards[') === 0) {
                                         $enabledWizards = substr($fieldExtraField, 8, strlen($fieldExtraField) - 8); // Cut off "wizards[
                                         $enabledWizards = substr($enabledWizards, 0, strlen($enabledWizards) - 1);
                                         $enabledWizardsArray = GeneralUtility::trimExplode('|', $enabledWizards, true);
@@ -753,7 +753,7 @@ class TcaMigration
                     $defaultExtrasArray = GeneralUtility::trimExplode(':', $originalValue, true);
                     $isRichtextField = false;
                     foreach ($defaultExtrasArray as $defaultExtrasField) {
-                        if (substr($defaultExtrasField, 0, 8) === 'richtext') {
+                        if (strpos($defaultExtrasField, 'richtext') === 0) {
                             $isRichtextField = true;
                             $fieldConfig['config']['enableRichtext'] = true;
                             $fieldConfig['config']['richtextConfiguration'] = 'default';
@@ -783,7 +783,7 @@ class TcaMigration
                         $defaultExtrasArray = GeneralUtility::trimExplode(':', $originalValue, true);
                         $isRichtextField = false;
                         foreach ($defaultExtrasArray as $defaultExtrasField) {
-                            if (substr($defaultExtrasField, 0, 8) === 'richtext') {
+                            if (strpos($defaultExtrasField, 'richtext') === 0) {
                                 $isRichtextField = true;
                                 $fieldConfig['config']['enableRichtext'] = true;
                                 $fieldConfig['config']['richtextConfiguration'] = 'default';
@@ -1184,7 +1184,7 @@ class TcaMigration
                                 $defaultExtrasArray = GeneralUtility::trimExplode(':', $defaultExtras, true);
                                 $newDefaultExtrasArray = [];
                                 foreach ($defaultExtrasArray as $fieldExtraField) {
-                                    if (substr($fieldExtraField, 0, 8) === 'wizards[') {
+                                    if (strpos($fieldExtraField, 'wizards[') === 0) {
                                         $enabledWizards = substr($fieldExtraField, 8, strlen($fieldExtraField) - 8); // Cut off "wizards[
                                         $enabledWizards = substr($enabledWizards, 0, strlen($enabledWizards) - 1);
                                         $enabledWizardsArray = GeneralUtility::trimExplode('|', $enabledWizards, true);
index a6a3043..d0e27be 100644 (file)
@@ -1042,7 +1042,7 @@ class PackageManager implements SingletonInterface
         if (!is_object($manifest)) {
             throw new Exception\InvalidPackageManifestException('Invalid composer manifest in package path: ' . $packagePath, 1348146451);
         }
-        if (isset($manifest->type) && substr($manifest->type, 0, 10) === 'typo3-cms-') {
+        if (isset($manifest->type) && strpos($manifest->type, 'typo3-cms-') === 0) {
             $packageKey = PathUtility::basename($packagePath);
             return preg_replace('/[^A-Za-z0-9._-]/', '', $packageKey);
         }
index 8c69f3b..dbd4756 100644 (file)
@@ -70,7 +70,7 @@ abstract class AbstractHierarchicalFilesystemDriver extends AbstractDriver
 
         // filePath must be valid
         // Special case is required by vfsStream in Unit Test context
-        if (!$this->isPathValid($filePath) && substr($filePath, 0, 6) !== 'vfs://') {
+        if (!$this->isPathValid($filePath) && strpos($filePath, 'vfs://') !== 0) {
             throw new InvalidPathException('File ' . $filePath . ' is not valid (".." and "//" is not allowed in path).', 1320286857);
         }
         return $filePath;
index a4e9694..5a95ecc 100644 (file)
@@ -659,7 +659,7 @@ class ExtendedTemplateService extends TemplateService
             $HTML .= $depthData;
             $alttext = '[' . $row['templateID'] . ']';
             $alttext .= $row['pid'] ? ' - ' . BackendUtility::getRecordPath($row['pid'], $GLOBALS['SOBE']->perms_clause, 20) : '';
-            $icon = substr($row['templateID'], 0, 3) === 'sys'
+            $icon = strpos($row['templateID'], 'sys') === 0
                 ? '<span title="' . htmlspecialchars($alttext) . '">' . $iconFactory->getIconForRecord('sys_template', $row, Icon::SIZE_SMALL)->render() . '</span>'
                 : '<span title="' . htmlspecialchars($alttext) . '">' . $iconFactory->getIcon('mimetypes-x-content-template-static', Icon::SIZE_SMALL)->render() . '</span>';
             if (in_array($row['templateID'], $this->clearList_const) || in_array($row['templateID'], $this->clearList_setup)) {
index 072d7fe..1012dd4 100644 (file)
@@ -963,7 +963,7 @@ class TemplateService
         }
         // If "Default (include before if root flag is set)" is set OR
         // "Always include before this template record" AND root-flag are set
-        if ($staticFileMode == 1 || $staticFileMode == 0 && substr($templateID, 0, 4) === 'sys_' && $row['root']) {
+        if ($staticFileMode == 1 || $staticFileMode == 0 && strpos($templateID, 'sys_') === 0 && $row['root']) {
             $this->addExtensionStatics($idList, $templateID, $pid);
         }
         // Include Static Template Records after all other TypoScript has been included.
index 629c49f..61e32ab 100644 (file)
@@ -85,7 +85,7 @@ class ClassNamingUtility
     {
         $matches = [];
 
-        if (substr($controllerObjectName, 0, 9) === 'TYPO3\\CMS') {
+        if (strpos($controllerObjectName, 'TYPO3\\CMS') === 0) {
             $extensionName = '^(?P<vendorName>[^\\\\]+\\\[^\\\\]+)\\\(?P<extensionName>[^\\\\]+)';
         } else {
             $extensionName = '^(?P<vendorName>[^\\\\]+)\\\\(?P<extensionName>[^\\\\]+)';
index df62d83..beacf0f 100644 (file)
@@ -383,7 +383,7 @@ class GeneralUtility
                     // Modulo is 0 if this is a 8-bit-boundary
                     $maskIntModulo = $maskInt % 8;
                     $numFullCharactersUntilBoundary = (int)($maskInt / 8);
-                    if (substr($testBin, 0, $numFullCharactersUntilBoundary) !== substr($baseIPBin, 0, $numFullCharactersUntilBoundary)) {
+                    if (strpos($testBin, substr($baseIPBin, 0, $numFullCharactersUntilBoundary)) !== 0) {
                         $success = false;
                     } elseif ($maskIntModulo > 0) {
                         // If not an 8-bit-boundary, check bits of last character
@@ -1658,7 +1658,7 @@ class GeneralUtility
                 $documentTag = $tagName;
             }
             // Test for name space:
-            $tagName = $NSprefix && substr($tagName, 0, strlen($NSprefix)) == $NSprefix ? substr($tagName, strlen($NSprefix)) : $tagName;
+            $tagName = $NSprefix && strpos($tagName, $NSprefix) === 0 ? substr($tagName, strlen($NSprefix)) : $tagName;
             // Test for numeric tag, encoded on the form "nXXX":
             $testNtag = substr($tagName, 1);
             // Closing tag.
index 98a5126..e4d04b2 100644 (file)
@@ -149,7 +149,7 @@ class ClassMapGenerator
         // strip strings
         $contents = preg_replace('{"[^"\\\\]*+(\\\\.[^"\\\\]*+)*+"|\'[^\'\\\\]*+(\\\\.[^\'\\\\]*+)*+\'}s', 'null', $contents);
         // strip leading non-php code if needed
-        if (substr($contents, 0, 2) !== '<?') {
+        if (strpos($contents, '<?') !== 0) {
             $contents = preg_replace('{^.+?<\?}s', '<?', $contents, 1, $replacements);
             if ($replacements === 0) {
                 return [];
index 701b9cc..18f8a31 100644 (file)
@@ -208,7 +208,7 @@ class LegacyLinkNotationConverterTest extends UnitTestCase
         }
         // fake methods to return proper objects
         if ($expected['type'] === LinkService::TYPE_FOLDER) {
-            if (substr($expected['folder'], 0, 5) === 'file:') {
+            if (strpos($expected['folder'], 'file:') === 0) {
                 $expected['folder'] = substr($expected['folder'], 5);
             }
             $folderObject = new Folder($storage, $expected['folder'], $expected['folder']);
@@ -254,7 +254,7 @@ class LegacyLinkNotationConverterTest extends UnitTestCase
         }
         // fake methods to return proper objects
         if ($parameters['type'] === LinkService::TYPE_FOLDER) {
-            if (substr($parameters['folder'], 0, 5) === 'file:') {
+            if (strpos($parameters['folder'], 'file:') === 0) {
                 $parameters['folder'] = substr($parameters['folder'], 5);
             }
             // fake "0" storage
index 5333466..f575ff6 100644 (file)
@@ -222,7 +222,7 @@ class Arguments extends \ArrayObject
      */
     public function __call($methodName, array $arguments)
     {
-        if (substr($methodName, 0, 3) !== 'set') {
+        if (strpos($methodName, 'set') !== 0) {
             throw new \LogicException('Unknown method "' . $methodName . '".', 1210858451);
         }
         $firstLowerCaseArgumentName = $this->translateToLongArgumentName(strtolower($methodName[3]) . substr($methodName, 4));
index 300afb3..b5bee22 100644 (file)
@@ -201,7 +201,7 @@ class Response extends \TYPO3\CMS\Extbase\Mvc\Response
      */
     public function setHeader($name, $value, $replaceExistingHeader = true)
     {
-        if (strtoupper(substr($name, 0, 4)) === 'HTTP') {
+        if (stripos($name, 'HTTP') === 0) {
             throw new \InvalidArgumentException('The HTTP status header must be set via setStatus().', 1220541963);
         }
         if ($replaceExistingHeader === true || !isset($this->headers[$name])) {
index 490ee13..ca4751d 100644 (file)
@@ -228,13 +228,13 @@ class Repository implements RepositoryInterface, \TYPO3\CMS\Core\SingletonInterf
      */
     public function __call($methodName, $arguments)
     {
-        if (substr($methodName, 0, 6) === 'findBy' && strlen($methodName) > 7) {
+        if (strpos($methodName, 'findBy') === 0 && strlen($methodName) > 7) {
             $propertyName = lcfirst(substr($methodName, 6));
             $query = $this->createQuery();
             $result = $query->matching($query->equals($propertyName, $arguments[0]))->execute();
             return $result;
         }
-        if (substr($methodName, 0, 9) === 'findOneBy' && strlen($methodName) > 10) {
+        if (strpos($methodName, 'findOneBy') === 0 && strlen($methodName) > 10) {
             $propertyName = lcfirst(substr($methodName, 9));
             $query = $this->createQuery();
 
@@ -245,7 +245,7 @@ class Repository implements RepositoryInterface, \TYPO3\CMS\Core\SingletonInterf
             if (is_array($result)) {
                 return $result[0] ?? null;
             }
-        } elseif (substr($methodName, 0, 7) === 'countBy' && strlen($methodName) > 8) {
+        } elseif (strpos($methodName, 'countBy') === 0 && strlen($methodName) > 8) {
             $propertyName = lcfirst(substr($methodName, 7));
             $query = $this->createQuery();
             $result = $query->matching($query->equals($propertyName, $arguments[0]))->execute()->count();
index f59f111..d41ef8b 100644 (file)
@@ -251,13 +251,13 @@ class ObjectAccess
                 }
             }
             $methodName = $method->getName();
-            if (substr($methodName, 0, 2) === 'is') {
+            if (strpos($methodName, 'is') === 0) {
                 $declaredPropertyNames[] = lcfirst(substr($methodName, 2));
             }
-            if (substr($methodName, 0, 3) === 'get') {
+            if (strpos($methodName, 'get') === 0) {
                 $declaredPropertyNames[] = lcfirst(substr($methodName, 3));
             }
-            if (substr($methodName, 0, 3) === 'has') {
+            if (strpos($methodName, 'has') === 0) {
                 $declaredPropertyNames[] = lcfirst(substr($methodName, 3));
             }
         }
@@ -290,7 +290,7 @@ class ObjectAccess
             $declaredPropertyNames = array_keys(get_class_vars(get_class($object)));
         }
         foreach (get_class_methods($object) as $methodName) {
-            if (substr($methodName, 0, 3) === 'set' && is_callable([$object, $methodName])) {
+            if (strpos($methodName, 'set') === 0 && is_callable([$object, $methodName])) {
                 $declaredPropertyNames[] = lcfirst(substr($methodName, 3));
             }
         }
index 9af886f..20ec5a8 100644 (file)
@@ -143,7 +143,7 @@ class ImageService implements \TYPO3\CMS\Core\SingletonInterface
      */
     protected function getImageFromSourceString($src, $treatIdAsReference)
     {
-        if ($this->environmentService->isEnvironmentInBackendMode() && substr($src, 0, 3) === '../') {
+        if ($this->environmentService->isEnvironmentInBackendMode() && strpos($src, '../') === 0) {
             $src = substr($src, 3);
         }
         if (MathUtility::canBeInterpretedAsInteger($src)) {
index 1276b8a..4ccab62 100644 (file)
@@ -103,7 +103,7 @@ class CshViewHelper extends AbstractBackendViewHelper
             $moduleName = $currentRequest->getPluginName();
             $table = '_MOD_' . $moduleName;
         }
-        if (substr($label, 0, 4) === 'LLL:') {
+        if (strpos($label, 'LLL:') === 0) {
             $label = htmlspecialchars(self::getLanguageService()->sL($label));
         }
         $label = '<label>' . $label . '</label>';
index ded0d71..3c5a3a7 100644 (file)
@@ -2814,7 +2814,7 @@ class TypoScriptFrontendController implements LoggerAwareInterface
                 // As str_* methods are locale aware and turkish has no upper case I
                 // Class autoloading and other checks depending on case changing break with turkish locale LC_CTYPE
                 // @see http://bugs.php.net/bug.php?id=35050
-                if (substr($locale, 0, 2) !== 'tr') {
+                if (strpos($locale, 'tr') !== 0) {
                     setlocale(LC_CTYPE, ...$availableLocales);
                 }
                 setlocale(LC_MONETARY, ...$availableLocales);
index adc9487..001aa65 100644 (file)
@@ -430,7 +430,7 @@ class PageLinkBuilder extends AbstractTypolinkBuilder
                     // domains. absRefPrefix can contain domain name, which will screw up
                     // the link to the external domain.
                     $prefixLength = strlen($tsfe->absRefPrefix);
-                    if (substr($LD['totalURL'], 0, $prefixLength) === $tsfe->absRefPrefix) {
+                    if (strpos($LD['totalURL'], $tsfe->absRefPrefix) === 0) {
                         $LD['totalURL'] = substr($LD['totalURL'], $prefixLength);
                     }
                 }
index 100c251..f98b98b 100644 (file)
@@ -643,7 +643,7 @@ class Import extends ImportExport
         foreach ($pidsFromTree as $origPid => $newPid) {
             if ($newPid >= 0 && $this->dontIgnorePid('pages', $origPid)) {
                 // If the page had a new id (because it was created) use that instead!
-                if (substr($this->import_newId_pids[$origPid], 0, 3) === 'NEW') {
+                if (strpos($this->import_newId_pids[$origPid], 'NEW') === 0) {
                     if ($this->import_mapId['pages'][$origPid]) {
                         $mappedPid = $this->import_mapId['pages'][$origPid];
                         $cmd_data['pages'][$mappedPid]['move'] = $newPid;
index 215860c..e7a085c 100644 (file)
@@ -346,7 +346,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
             }
         }
         // Print a message telling which words in which sections we searched for
-        if (substr($this->searchData['sections'], 0, 2) === 'rl') {
+        if (strpos($this->searchData['sections'], 'rl') === 0) {
             $result['searchedInSectionInfo'] = LocalizationUtility::translate('result.inSection', 'IndexedSearch') . ' "' . $this->getPathFromPageId(substr($this->searchData['sections'], 4)) . '"';
         }
 
@@ -393,7 +393,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
         $resultRows = $newResultRows;
         $this->resultSections = [];
         if ($freeIndexUid <= 0 && $this->searchData['group'] === 'sections') {
-            $rl2flag = substr($this->searchData['sections'], 0, 2) === 'rl';
+            $rl2flag = strpos($this->searchData['sections'], 'rl') === 0;
             $sections = [];
             foreach ($resultRows as $row) {
                 $id = $row['rl0'] . '-' . $row['rl1'] . ($rl2flag ? '-' . $row['rl2'] : '');
@@ -682,7 +682,7 @@ class SearchController extends \TYPO3\CMS\Extbase\Mvc\Controller\ActionControlle
             } else {
                 // Default creation / finding of icon:
                 $icon = '';
-                if ($imageType === '0' || substr($imageType, 0, 2) === '0:') {
+                if ($imageType === '0' || strpos($imageType, '0:') === 0) {
                     if (is_array($specRowConf['pageIcon'])) {
                         $this->iconFileNameCache[$imageType] = $GLOBALS['TSFE']->cObj->cObjGetSingle('IMAGE', $specRowConf['pageIcon']);
                     } else {
index 4b3a239..01a0b4b 100644 (file)
@@ -791,12 +791,12 @@ class IndexSearchRepository
                 $expressionBuilder->in('ISEC.rl0', GeneralUtility::intExplode(',', $this->searchRootPageIdList, true))
             );
         }
-        if (substr($this->sections, 0, 4) === 'rl1_') {
+        if (strpos($this->sections, 'rl1_') === 0) {
             $whereClause->add(
                 $expressionBuilder->in('ISEC.rl1', GeneralUtility::intExplode(',', substr($this->sections, 4)))
             );
             $match = true;
-        } elseif (substr($this->sections, 0, 4) === 'rl2_') {
+        } elseif (strpos($this->sections, 'rl2_') === 0) {
             $whereClause->add(
                 $expressionBuilder->in('ISEC.rl2', GeneralUtility::intExplode(',', substr($this->sections, 4)))
             );
@@ -804,7 +804,7 @@ class IndexSearchRepository
         } else {
             // Traversing user configured fields to see if any of those are used to limit search to a section:
             foreach ($GLOBALS['TYPO3_CONF_VARS']['EXTCONF']['indexed_search']['addRootLineFields'] ?? [] as $fieldName => $rootLineLevel) {
-                if (substr($this->sections, 0, strlen($fieldName) + 1) == $fieldName . '_') {
+                if (strpos($this->sections, $fieldName . '_') === 0) {
                     $whereClause->add(
                         $expressionBuilder->in(
                             'ISEC.' . $fieldName,
@@ -1073,7 +1073,7 @@ class IndexSearchRepository
         // If any of the ranking sortings are selected, we must make a
         // join with the word/rel-table again, because we need to
         // calculate ranking based on all search-words found.
-        if (substr($this->sortOrder, 0, 5) === 'rank_') {
+        if (strpos($this->sortOrder, 'rank_') === 0) {
             $queryBuilder
                 ->from('index_words', 'IW')
                 ->from('index_rel', 'IR')
index ed3bd3a..ab0dfea 100644 (file)
@@ -1016,7 +1016,7 @@ class Indexer
         $localPath = '';
         $baseURL = GeneralUtility::getIndpEnv('TYPO3_SITE_URL');
         $baseURLLength = strlen($baseURL);
-        if (substr($sourcePath, 0, $baseURLLength) == $baseURL) {
+        if (strpos($sourcePath, $baseURL) === 0) {
             $sourcePath = substr($sourcePath, $baseURLLength);
             $localPath = Environment::getPublicPath() . '/' . $sourcePath;
             if (!self::isAllowedLocalFile($localPath)) {
@@ -1039,7 +1039,7 @@ class Indexer
         if (isset($GLOBALS['TSFE']) && $GLOBALS['TSFE'] instanceof TypoScriptFrontendController) {
             $absRefPrefix = $GLOBALS['TSFE']->config['config']['absRefPrefix'];
             $absRefPrefixLength = strlen($absRefPrefix);
-            if ($absRefPrefixLength > 0 && substr($sourcePath, 0, $absRefPrefixLength) == $absRefPrefix) {
+            if ($absRefPrefixLength > 0 && strpos($sourcePath, $absRefPrefix) === 0) {
                 $sourcePath = substr($sourcePath, $absRefPrefixLength);
                 $localPath = Environment::getPublicPath() . '/' . $sourcePath;
                 if (!self::isAllowedLocalFile($localPath)) {
@@ -1109,7 +1109,7 @@ class Indexer
     protected static function isAllowedLocalFile($filePath)
     {
         $filePath = GeneralUtility::resolveBackPath($filePath);
-        $insideWebPath = substr($filePath, 0, strlen(Environment::getPublicPath())) === Environment::getPublicPath();
+        $insideWebPath = strpos($filePath, Environment::getPublicPath()) === 0;
         $isFile = is_file($filePath);
         return $insideWebPath && $isFile;
     }
index e645623..7e0ee87 100644 (file)
@@ -1050,7 +1050,7 @@ For each website you need a TypoScript template on the main page of your website
 
         // check if database charset is utf-8 - also allow utf8mb4
         $defaultDatabaseCharset = $this->getDefaultDatabaseCharset($dbName);
-        if (substr($defaultDatabaseCharset, 0, 4) !== 'utf8') {
+        if (strpos($defaultDatabaseCharset, 'utf8') !== 0) {
             $result = new FlashMessage(
                 'Your database uses character set "' . $defaultDatabaseCharset . '", '
                 . 'but only "utf8" is supported with TYPO3. You probably want to change this before proceeding.',
index 2446210..ec7fbad 100644 (file)
@@ -543,7 +543,7 @@ class UpgradeController extends AbstractController
         foreach ($restFiles as $restFile) {
             // Skip files in "8.x" directory
             /** @var $restFile SplFileInfo */
-            if (substr($restFile->getRelativePath(), 0, 1) === '8') {
+            if (strpos($restFile->getRelativePath(), '8') === 0) {
                 continue;
             }
 
index 407be99..c965f54 100644 (file)
@@ -625,7 +625,7 @@ class Check implements CheckInterface
     protected function checkWindowsApacheThreadStackSize()
     {
         if ($this->isWindowsOs()
-            && substr($_SERVER['SERVER_SOFTWARE'], 0, 6) === 'Apache'
+            && strpos($_SERVER['SERVER_SOFTWARE'], 'Apache') === 0
         ) {
             $this->messageQueue->enqueue(new FlashMessage(
                 'This current value cannot be checked by the system, so please ignore this warning if it'
index f3dfdb3..67e04a5 100644 (file)
@@ -233,7 +233,7 @@ class DatabaseIntegrityController
         $addConditionCheck = GeneralUtility::_GP('qG_ins');
         $setLimitToStart = false;
         foreach ($OLD_MOD_SETTINGS as $key => $val) {
-            if (substr($key, 0, 5) === 'query' && $this->MOD_SETTINGS[$key] != $val && $key !== 'queryLimit' && $key !== 'use_listview') {
+            if (strpos($key, 'query') === 0 && $this->MOD_SETTINGS[$key] != $val && $key !== 'queryLimit' && $key !== 'use_listview') {
                 $setLimitToStart = true;
                 if ($key === 'queryTable' && !$addConditionCheck) {
                     $this->MOD_SETTINGS['queryConfig'] = '';
index 7ae1e57..d931a0f 100644 (file)
@@ -136,11 +136,11 @@ class ConfigurationStatus implements StatusProviderInterface
         if (function_exists('memcache_connect') && is_array($memcachedServers)) {
             foreach ($memcachedServers as $testServer) {
                 $configuredServer = $testServer;
-                if (substr($testServer, 0, 7) === 'unix://') {
+                if (strpos($testServer, 'unix://') === 0) {
                     $host = $testServer;
                     $port = 0;
                 } else {
-                    if (substr($testServer, 0, 6) === 'tcp://') {
+                    if (strpos($testServer, 'tcp://') === 0) {
                         $testServer = substr($testServer, 6);
                     }
                     if (strstr($testServer, ':') !== false) {
index 00465d5..a8d091b 100644 (file)
@@ -119,7 +119,7 @@ class CommandLineBackend extends AbstractBackend
             // Ok, we got the private key. Get the modulus.
             $command = $this->opensslPath . ' rsa -noout -modulus -in ' . escapeshellarg($privateKeyFile);
             $value = CommandUtility::exec($command);
-            if (substr($value, 0, 8) === 'Modulus=') {
+            if (strpos($value, 'Modulus=') === 0) {
                 $publicKey = substr($value, 8);
 
                 $keyPair->setExponent(self::DEFAULT_EXPONENT);
@@ -171,7 +171,7 @@ class CommandLineBackend extends AbstractBackend
         if ($this->opensslPath) {
             // If path exists, test that command runs and can produce output
             $test = CommandUtility::exec($this->opensslPath . ' version');
-            $result = substr($test, 0, 8) === 'OpenSSL ';
+            $result = strpos($test, 'OpenSSL ') === 0;
         }
         return $result;
     }
index ae57856..caa577d 100644 (file)
@@ -49,7 +49,7 @@ class BackendWarnings
             } elseif (!@is_writable($path)) {
                 // Directory is not writable
                 $warnings['rsaauth'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_directory_not_writable');
-            } elseif (substr($path, 0, strlen(Environment::getPublicPath())) === Environment::getPublicPath()) {
+            } elseif (strpos($path, Environment::getPublicPath()) === 0) {
                 // Directory is inside the site root
                 $warnings['rsaauth'] = $lang->sL('LLL:EXT:rsaauth/Resources/Private/Language/locallang.xlf:hook_directory_inside_siteroot');
             }
index 59f1723..fc6a600 100644 (file)
@@ -60,7 +60,7 @@ class RsaAuthService extends AuthenticationService
         $isProcessed = false;
         if ($passwordTransmissionStrategy === 'rsa') {
             $password = $loginData['uident'];
-            if (substr($password, 0, 4) === 'rsa:') {
+            if (strpos($password, 'rsa:') === 0) {
                 $decryptedPassword = $this->getRsaEncryptionDecoder()->decrypt($password);
                 if ($decryptedPassword !== $password) {
                     $loginData['uident_text'] = $decryptedPassword;
index 238550e..873e3ee 100644 (file)
@@ -484,7 +484,7 @@ class SetupModuleController
                 continue;
             }
 
-            if (substr($fieldName, 0, 8) === '--div--;') {
+            if (strpos($fieldName, '--div--;') === 0) {
                 if ($firstTabLabel === '') {
                     // First tab
                     $tabLabel = $this->getLabel(substr($fieldName, 8), '', false);
@@ -820,7 +820,7 @@ class SetupModuleController
      */
     protected function getLabel($str, $key = '', $addLabelTag = true)
     {
-        if (substr($str, 0, 4) === 'LLL:') {
+        if (strpos($str, 'LLL:') === 0) {
             $out = htmlspecialchars($this->getLanguageService()->sL($str));
         } else {
             $out = htmlspecialchars($str);
index 883b158..3c08d4d 100644 (file)
@@ -619,7 +619,7 @@ class ActionTask implements \TYPO3\CMS\Taskcenter\TaskInterface
     protected function fixUsername($username, $prefix)
     {
         $prefix = trim($prefix);
-        if (substr($username, 0, strlen($prefix)) === $prefix) {
+        if (strpos($username, $prefix) === 0) {
             $username = substr($username, strlen($prefix));
         }
         return $prefix . $username;
@@ -799,7 +799,7 @@ class ActionTask implements \TYPO3\CMS\Taskcenter\TaskInterface
         $content = '';
         if (\TYPO3\CMS\Core\Utility\ExtensionManagementUtility::isLoaded('lowlevel')) {
             $sql_query = unserialize($record['t2_data']);
-            if (!is_array($sql_query) || is_array($sql_query) && strtoupper(substr(trim($sql_query['qSelect']), 0, 6)) === 'SELECT') {
+            if (!is_array($sql_query) || is_array($sql_query) && stripos(trim($sql_query['qSelect']), 'SELECT') === 0) {
                 $actionContent = '';
                 $fullsearch = GeneralUtility::makeInstance(\TYPO3\CMS\Core\Database\QueryView::class);
                 $fullsearch->formW = 40;