3v4l.org

run code in 300+ PHP versions simultaneously
<?php $myVar = "My sister alannis Is not That blonde, here is a good place. I know Ariane is not MY SISTER!"; echo "$myVar\n"; $myWords = [ ["is", "é"], ["on", "no"], ["that", "aquela"], ["sister", "irmã"], ["my", "minha"], ["myth", "mito"], ["he", "ele"], ["good", "bom"], ["ace", "perito"], ["i", "eu"] // notice I must be lowercase ]; $translations = array_column($myWords, 1, 0); // or skip this step and just declare $myWords as key-value pairs // length sorting is not necessary // preg_quote() and \Q\E are not used because dealing with words only (no danger of misinterpretation by regex) $pattern = '/\b(?>' . implode('|', array_keys($translations)) . ')\b/i'; // atomic group is slightly faster (no backtracking) /* echo $pattern; makes: /\b(?>is|on|that|sister|my|myth|he|good|ace)\b/i demo: https://regex101.com/r/DXTtDf/1 */ $translated = preg_replace_callback( $pattern, function($m) use($translations) { // bring $translations (lookup) array to function $encoding = 'UTF-8'; // default setting $key = mb_strtolower($m[0], $encoding); // standardize keys' case for lookup accessibility if (ctype_lower($m[0])) { // treat as all lower return $translations[$m[0]]; } elseif (mb_strlen($m[0], $encoding) > 1 && ctype_upper($m[0])) { // treat as all uppercase return mb_strtoupper($translations[$key], $encoding); } else { // treat as only first character uppercase return mb_strtoupper(mb_substr($translations[$key], 0, 1, $encoding), $encoding) // uppercase first . mb_substr($translations[$key], 1, mb_strlen($translations[$key], $encoding) - 1, $encoding); // append remaining lowercase } }, $myVar ); echo $translated;
Output for git.master, git.master_jit, rfc.property-hooks
My sister alannis Is not That blonde, here is a good place. I know Ariane is not MY SISTER! Minha irmã alannis É not Aquela blonde, here é a bom place. Eu know Ariane é not MINHA IRMÃ!

This tab shows result from various feature-branches currently under review by the php developers. Contact me to have additional branches featured.

Active branches

Archived branches

Once feature-branches are merged or declined, they are no longer available. Their functionality (when merged) can be viewed from the main output page


preferences:
122.1 ms | 405 KiB | 5 Q