Skip to content

Rector crashes on an odd preg_replace with /e #9653

@borys-p

Description

@borys-p

Hi All,

I'm running into an interesting error while upgrading a legacy codebase. The offending piece of code belongs to a Tidy backend parser for an ancient Xinha WYSIWYG editor, probably created during the PHP 5 era or even earlier.

Rector chokes on the following part:

    // PHP's urldecode doesn't understand %uHHHH for unicode
    $_REQUEST['content'] = preg_replace('/%u([a-f0-9]{4,4})/ei', 'utf8_chr(0x$1)', $_REQUEST['content']);

with:

[ERROR] Could not process "/app/admin/addons/xinha-nightly/plugins/SuperClean/tidy.php" file, due to:                  
         "System error: "Syntax error, unexpected T_STRING, expecting ')'1"                                             
                                                                                                                        
         Stack trace:                                                                                                   
         #0 vendor/rector/rector/vendor/nikic/php-parser/lib/PhpParser/ParserAbstract.php(173):                         
         PhpParser\ParserAbstract->doParse()                                                                            
         #1 vendor/rector/rector/src/PhpParser/Parser/SimplePhpParser.php(52): PhpParser\ParserAbstract->parse('<?php   
         utf8_chr(...')                                                                                                 
         #2 vendor/rector/rector/rules/Php72/NodeFactory/AnonymousFunctionFactory.php(98):                              
         Rector\PhpParser\Parser\SimplePhpParser->parseString('<?php utf8_chr(...')                                     
         #3 vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php(104):                       
         Rector\Php72\NodeFactory\AnonymousFunctionFactory->createAnonymousFunctionFromExpr(Object(PhpParser\Node\Scala 
         r\String_))                                                                                                    
         #4 vendor/rector/rector/rules/Php55/Rector/FuncCall/PregReplaceEModifierRector.php(93):                        
         Rector\Php55\Rector\FuncCall\PregReplaceEModifierRector->createAnonymousFunction(Object(PhpParser\Node\Arg))   
         #5 vendor/rector/rector/src/Rector/AbstractRector.php(106):                                                    
         Rector\Php55\Rector\FuncCall\PregReplaceEModifierRector->refactor(Object(PhpParser\Node\Expr\FuncCall))        
         #6 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(152):                              
         Rector\Rector\AbstractRector->enterNode(Object(PhpParser\Node\Expr\FuncCall))                                  
         #7 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(180):                              
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseNode(Object(PhpParser\Node\Expr\Assign))           
         #8 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(236):                              
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\Expression))       
         #9 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(140):                              
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseArray(Array)                                       
         #10 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(236):                             
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseNode(Object(PhpParser\Node\Stmt\If_))              
         #11 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(140):                             
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseArray(Array)                                       
         #12 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(236):                             
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseNode(Object(Rector\PhpParser\Node\FileNode))       
         #13 vendor/rector/rector/src/PhpParser/NodeTraverser/RectorNodeTraverser.php(84):                              
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverseArray(Array)                                       
         #14 vendor/rector/rector/src/Application/FileProcessor.php(96):                                                
         Rector\PhpParser\NodeTraverser\RectorNodeTraverser->traverse(Array)                                            
         #15 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(178):                                    
         Rector\Application\FileProcessor->processFile(Object(Rector\ValueObject\Application\File),                     
         Object(Rector\ValueObject\Configuration))                                                                      
         #16 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(152):                                    
         Rector\Application\ApplicationFileProcessor->processFile(Object(Rector\ValueObject\Application\File),          
         Object(Rector\ValueObject\Configuration))                                                                      
         #17 vendor/rector/rector/src/Application/ApplicationFileProcessor.php(128):                                    
         Rector\Application\ApplicationFileProcessor->processFiles(Array, Object(Rector\ValueObject\Configuration),     
         Object(Closure), Object(Closure))                                                                              
         #18 vendor/rector/rector/src/Console/Command/ProcessCommand.php(182):                                          
         Rector\Application\ApplicationFileProcessor->run(Object(Rector\ValueObject\Configuration),                     
         Object(RectorPrefix202602\Symfony\Component\Console\Input\ArgvInput))                                          
         #19 vendor/rector/rector/vendor/symfony/console/Command/Command.php(289):                                      
         Rector\Console\Command\ProcessCommand->execute(Object(RectorPrefix202602\Symfony\Component\Console\Input\ArgvI 
         nput), Object(RectorPrefix202602\Symfony\Component\Console\Output\ConsoleOutput))                              
         #20 vendor/rector/rector/vendor/symfony/console/Application.php(899):                                          
         RectorPrefix202602\Symfony\Component\Console\Command\Command->run(Object(RectorPrefix202602\Symfony\Component\ 
         Console\Input\ArgvInput), Object(RectorPrefix202602\Symfony\Component\Console\Output\ConsoleOutput))           
         #21 vendor/rector/rector/vendor/symfony/console/Application.php(279):                                          
         RectorPrefix202602\Symfony\Component\Console\Application->doRunCommand(Object(Rector\Console\Command\ProcessCo 
         mmand), Object(RectorPrefix202602\Symfony\Component\Console\Input\ArgvInput),                                  
         Object(RectorPrefix202602\Symfony\Component\Console\Output\ConsoleOutput))                                     
         #22 vendor/rector/rector/src/Console/ConsoleApplication.php(62):                                               
         RectorPrefix202602\Symfony\Component\Console\Application->doRun(Object(RectorPrefix202602\Symfony\Component\Co 
         nsole\Input\ArgvInput), Object(RectorPrefix202602\Symfony\Component\Console\Output\ConsoleOutput))             
         #23 vendor/rector/rector/vendor/symfony/console/Application.php(162):                                          
         Rector\Console\ConsoleApplication->doRun(Object(RectorPrefix202602\Symfony\Component\Console\Input\ArgvInput), 
         Object(RectorPrefix202602\Symfony\Component\Console\Output\ConsoleOutput))                                     
         #24 vendor/rector/rector/bin/rector.php(130): RectorPrefix202602\Symfony\Component\Console\Application->run()  
         #25 vendor/rector/rector/bin/rector(4): require_once('vendor/rec...')                                          
         #26 vendor/bin/rector(115): include('vendor/rec...')                                                           
         #27 {main}". On line: 319                                                                                      

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions