Sedan version 7 har vi redan ett fel när vi använder e-modifieraren med preg_replace(). faktiskt e-modifieraren, motsvarande PCRE PREG_REPLACE_EVAL-konstanten, användes tidigare i reguljära uttryck tillsammans med preg_replace()-funktionen när det var nödvändigt kör PHP för att generera utdatasträngen.
För att göra sitt jobb förlitade sig e-modifieraren på funktionen eval(), en mycket känslig funktion i form av säkerhet hänvisar, och därför e-modifieraren fasades ut i PHP 7. Det rekommenderas att använda preg_replace_callback() istället, eftersom det tillåter oss att definiera vår egen callback där vi kan köra PHP vid behov, men utan att behöva ta till eval().
Varför har den blivit utfasad?
Låt oss se ett enkelt exempel för att förklara det; Föreställ dig det här uttrycket där vi skickar en titel till versaler genom att tillämpa funktionen strtoupper() på utdatasträngen av preg_replace():
$title = “
/e-modifieraren
“; $title = preg_replace( ‘# #e’, ‘” Vad preg_replace() gör är: Letar efter mönstret som definieras i det reguljära uttrycket (första parametern) i variabeln $title Fångar de utdrag som matchar uppsättningarna inom parentes: ([1-6]) och (.*?), och numrerar dem i ordningsföljd: 1, 2, etc (0 skulle vara den fullständiga matchningen). Returnerar den andra parametersträngen genom att ersätta referenserna $1, $2, etc, med motsvarande värden som fångats i föregående steg. Om vi tittar på utdatasträngen kan vi se att en funktion, strtoupper() , exekveras, men funktionen finns i en sträng. För att PHP-funktioner som finns i en sträng ska kunna köras måste du skicka den strängen till eval()-funktionenoch det är vad e-modifieraren gör.
Låt oss nu föreställa oss samma kod men ta värdet av $title från en ingång: $title = $__GET[‘title’]; $title = preg_replace( ‘# #e’, ‘” Om användaren anger PHP-kod i inmatningssträngen, den koden skulle köras på grund av den användning som vi nämnde av eval()-funktionen. Det är en säkerhetssvaghetdet är han anledningen till att e-modifieraren fasades ut i PHP 7vilket är anledningen till att själva funktionen eval() bör användas med största försiktighet.
För att uppnå samma resultat som med preg_replace() och e-modifieraren, men utan risk att använda eval()kan du använda preg_replace_callback(), en funktion som låter oss definiera din egen återuppringning där vi kan hantera de fångade värdena och generera utdatasträngen som vi vill, inklusive kodexekvering.
Det tidigare exemplet skulle vara: $title = $__GET[‘title’]; $title = preg_replace_callback( ‘# #’, function ( $matches ) { $output = ‘ Eller lite bättre: $title = $__GET[‘title’]; $title = preg_replace_callback( ‘# #’, function ( $matches ) { $output = ‘ Enkelt uttryckt, om du behöver köra PHP på utdatasträngen för preg_replace(), bör du använda preg_replace_callback().
I versioner under PHP 7 kan du använda preg_replace() och e-modifieraren kommer att fungera, men eftersom det är ett potentiellt säkerhetshål är det bättre att använda preg_replace_callback() även i versioner under PHP 7.
Alternativ: preg_replace_callback()
Projekt