1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52
| <?php
/**
* Changes all the Nth $search occurences by $replace in $subject.
*
* Returns the new string in case of success, false otherwise.
*
* @param string|string[] $search The value to search
* @param string|string[] $replace The replacement value
* @param string $subject The subject (duh)
* @param integer|integer[] $occurence The occurence(s) at which the replacement shall be done
*
* @return string|false
*/
function str_replace_occurence ($search, $replace, $subject, $occurence) {
$occurence = array_flip((array)$occurence);
$search = array_values((array)$search);
$replace = array_values((array)$replace);
if (empty($subject) || empty($search))
return $subject;
if (($scount = count($search)) != count($replace))
return false;
foreach ($search as $offset => $needle) {
$pos = 0;
$len = strlen($needle);
$rep = $replace[$offset];
$occur = 0;
while (($pos = strpos($subject, $needle, $pos)) !== false && ++$occur) {
if (isset($occurence[$occur]))
($subject = substr($subject, 0, $pos) . $rep . substr($subject, $pos + $len));
$pos += $len;
}
}
return $subject;
}
// USAGE //
$str = "la maison sur la coline est une jolie maison";
// remplacer la deuxième occurence de 'la' par 'cette'
var_dump( str_replace_occurence('la', 'cette', $str, 2) );
// remplacer la première occurence de 'la' et 'maison' par 'cette' et 'cabane'
var_dump( str_replace_occurence(array('la','maison'), array('cette','cabane'), $str, 1) );
// remplacer la 3 ème occurence (inexistante) de 'maison' par 'bicoque'
var_dump( str_replace_occurence('maison', 'bicoque', $str, 3) ); |
Partager