2012-03-07 34 views
18

Quiero buscar y reemplazar la primera palabra con otra en php como los siguientes:php sustituir primera ocurrencia de la cadena desde la posición 0º

$str="nothing inside"; 

Reemplazar 'nada' a 'algo' por una búsqueda y reemplazar sin necesidad de utilizar substr

salida debe ser: 'algo dentro'

+0

¿Por qué sin substr? – lfxgroove

+1

posible duplicado de [¿Usar str \ _replace para que solo actúe en la primera coincidencia?] (Http://stackoverflow.com/questions/1252693/using-str-replace-so-that-it-only-acts-on -the-first-match) – Bas

Respuesta

35

Uso preg_replace() con un límite de 1:

preg_replace('/nothing/', 'something', $str, 1); 

Sustituir la expresión regular /nothing/ con cualquier cadena que desea buscar. Como las expresiones regulares siempre se evalúan de izquierda a derecha, siempre coincidirá con la primera instancia.

+3

Esta solución tiene problemas de escape si solo está usando cadenas genéricas, como si $ y tales están dentro de la cadena. http://stackoverflow.com/questions/1252693/php-str-replace-that-only-acts-on-the-first-match tiene una solución más genérica. – Anther

0

This function str_replace es el que usted está buscando.

+6

ese 4º parámetro cuenta las sustituciones realizadas, no limita las sustituciones a un número – mishu

+0

Tiene razón. Editaré mi respuesta. – steveoh

+0

@steveoh: str_replace reemplaza todas las apariciones, pero solo quiero la primera ocurrencia si existe al comienzo como función ltrim. Elimine solo el primer espacio. – Ben

2
preg_replace('/nothing/', 'something', $str, 1); 
+0

Esto reemplazará todas las apariciones. preg_replace ('/ OR /', '', $ str, 1) reemplaza la primera aparición de 'OR' pero no solo la aparición principal – Ben

3

probar esto

preg_replace('/^[a-zA-Z]\s/', 'ReplacementWord ', $string) 

lo que hace es seleccionar cualquier cosa, desde el principio hasta el primer espacio en blanco y reemplazarlo con replcementWord. observe un espacio después de replcementWord. esto se debe a que hemos añadido \s en cadena de búsqueda

+0

Yo también, no tan buena en regEx. Puedes probar este enlace [¿Así que quieres aprender expresiones regulares?] (http://www.stedee.id.au/Learn_Regular_Expressions) –

+0

Lo siento, pero no puedo formatearlo correctamente –

10

en la página del manual de str_replace (http://php.net/manual/en/function.str-replace.php) se puede encontrar esta función

function str_replace_once($str_pattern, $str_replacement, $string){ 

    if (strpos($string, $str_pattern) !== false){ 
     $occurrence = strpos($string, $str_pattern); 
     return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern)); 
    } 

    return $string; 
} 

muestra de uso: http://codepad.org/JqUspMPx

+0

igual que preg_replace ('/ search /', 'replace', $ str, 1); – Ben

+2

@Ben Las funciones son similares, pero definitivamente no son lo mismo. Si usa un personaje que necesita ser escapado por una expresión regular, obtendrá errores inesperados si usa preg_replace. – Anther

+0

@mishu todo el día perdido y luego encontré tu respuesta, gracias amigo. –

-1

ltrim() eliminará el texto no deseado al principio de una cadena.

$do = 'nothing'; // what you want 
$dont = 'something'; // what you dont want 
$str = 'something inside'; 
$newstr = $do.ltrim($str , $dont); 
echo $newstr.'<br>'; 
+0

ltrim() elimina todos los caracteres en la lista dada, no la secuencia de caracteres. Por favor actualiza tu respuesta. – Calin

0

Corrí a este tema y quería una solución y esto no era 100% correcto para mí, porque si la cadena era como $str = "mine'this, la appostrophe podría causar un problema. así que se me ocurrió un pequeño truco:

$stick=''; 
$cook = explode($str,$cookie,2); 
     foreach($cook as $c){ 
      if(preg_match("/^'/", $c)||preg_match('/^"/', $c)){ 
       //we have 's dsf fds... so we need to find the first |sess| because it is the delimiter' 
       $stick = '|sess|'.explode('|sess|',$c,2)[1]; 
      }else{ 
       $stick = $c; 
      } 
      $cookies.=$stick; 
     } 
0

¿No es esto lo mejor para la compacidad y el rendimiento?

if(($offset=strpos($string,$replaced))!==false){ 
    $string=substr_replace($replaced,$replacer,$offset,strlen($replaced)); 
} 
Cuestiones relacionadas