Pregunta

Estoy tratando de lograr lo siguiente:

$ subject = 'a b a';
$ search = 'a';
$ replace = '1';

Resultado deseado:

Matriz
(
[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

¿Fue útil?

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
)
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top