preg_replace - conjunto de reemplazos individuales
-
22-07-2019 - |
Pregunta
Estoy tratando de lograr lo siguiente:
$ search = 'a';
$ replace = '1';
Resultado deseado:
(
[0] = > 1 b a
[1] = > a b 1
)
¿Hay alguna forma de lograr esto con preg_replace?
preg_replace ('/ \ b'. $ search. '(? = \ s + | $) / u', $ replace, array ($ subject));
devolverá todos los reemplazos en el mismo resultado:
Matriz
(
[0] = > 1 b 1
)
Saludos
Solución
Creo que no es posible. Puede especificar un límite de reemplazos en el cuarto parámetro opcional, pero eso siempre comienza desde el principio.
Podría ser posible lograr lo que está buscando con preg_split ()
. Simplemente tendría que dividir su cadena en todas las ocasiones de su patrón de búsqueda y luego meterse con ellos uno por uno. Si su patrón de búsqueda es solo una cadena simple, puede lograr lo mismo con explotar ()
. Si necesita ayuda para resolver este enfoque, con gusto lo ayudaré.
EDITAR : veamos si esto funciona para usted:
$subject = 'a b a';
$pattern = '/a/';
$replace = 1;
// We split the string up on all of its matches and obtain the matches, too
$parts = preg_split($pattern, $subject);
preg_match_all($pattern, $subject, $matches);
$numParts = count($parts);
$results = array();
for ($i = 1; $i < $numParts; $i++)
{
// We're modifying a copy of the parts every time
$partsCopy = $parts;
// First, replace one of the matches
$partsCopy[$i] = $replace.$partsCopy[$i];
// Prepend the matching string to those parts that are not supposed to be replaced yet
foreach ($partsCopy as $index => &$value)
{
if ($index != $i && $index != 0)
$value = $matches[0][$index - 1].$value;
}
// Bring it all back together now
$results[] = implode('', $partsCopy);
}
print_r($results);
Nota: Esto aún no se ha probado. Informe si funciona.
EDITAR 2 :
Lo probé con tu ejemplo ahora, arreglé algunas cosas y funciona ahora (al menos con ese ejemplo).
Otros consejos
function multipleReplace($search,$subject,$replace) {
preg_match_all($search, $subject,$matches,PREG_OFFSET_CAPTURE);
foreach($matches as $match) {
if (is_array($match)) {
foreach ($match as $submatch) {
list($string,$start) = $submatch;
$length = strlen($string);
$val = "";
if ($start - 1 > 0) {
$val .= substr($subject,0,$start);
}
$val .= preg_replace($search,$string,$replace);
$val .= substr($subject,$start + $length);
$ret[] = $val;
}
}
}
return $ret;
}
$search = 'a';
print_r(multipleReplace('/\b'.$search.'(?=\s+|$)/u','a b a','1'));
Salida
Array
(
[0] => 1 b a
[1] => a b 1
)