2012-03-07 12 views
18

chcę, aby wyszukać i zastąpić pierwsze słowo z innego w php jak w następujący sposób:php zastąpić pierwsze wystąpienie napisu z 0th pozycji

$str="nothing inside"; 

Wymienić „nic” to „coś” o poszukiwaniu i wymienić bez użycia substr

wyjście powinno być: „coś w środku”

+0

Dlaczego bez substratu? – lfxgroove

+1

możliwy duplikat [Używanie str \ _replace, aby działał tylko przy pierwszym dopasowaniu?] (Http://stackoverflow.com/questions/1252693/using-str-replace-to-that-it-only-actsonon -the-first-match) – Bas

Odpowiedz

35

Zastosowanie preg_replace() z limitem 1:

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

Wymień wyrażenia regularnego /nothing/ ze cokolwiek ciąg chcesz wyszukać. Ponieważ wyrażenia regularne są zawsze oceniane od lewej do prawej, zawsze będą pasować do pierwszej instancji.

+3

To rozwiązanie ma problemy z ucieczką, jeśli używasz zwykłych łańcuchów, na przykład jeśli $ i takie są w ciągu znaków. http://stackoverflow.com/questions/1252693/php-str-replace-that-only-acts-on-the-first-match ma bardziej ogólne rozwiązanie. – Anther

0

This function str_replace jest jeden szukasz.

+6

, że 4. parametr zlicza wykonane zastępstwa, nie ogranicza zamienników do numeru – mishu

+0

Masz rację. Zmodyfikuje moją odpowiedź. – steveoh

+0

@steveoh: str_replace zastępuje wszystkie wystąpienia, ale chcę tylko pierwsze wystąpienie, jeśli istnieje na początku, tak jak funkcja ltrim usuwa tylko pierwsze spacje. – Ben

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

Spowoduje to zastąpienie wszystkich wystąpień. preg_replace ('/ OR /', '', $ str, 1) zastępuje pierwsze wystąpienie 'OR', ale nie tylko główne zdarzenie – Ben

3

spróbować

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

co robi to wybierz coś od początku do pierwszej białej przestrzeni i zastąpić go replcementWord. zauważ spację po replcementWord. to dlatego dodaliśmy \s w ciągu wyszukiwania

+0

Ja też, nie tak dobrze w regEx. Możesz spróbować tego linku [Więc chcesz się nauczyć wyrażeń regularnych?] (http://www.stedee.id.au/Learn_Regular_Expressions) –

+0

Niestety, ale nie mogę go poprawnie sformatować –

10

na stronie man str_replace (http://php.net/manual/en/function.str-replace.php) można znaleźć tę funkcję

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; 
} 

Przykład użycia: http://codepad.org/JqUspMPx

+0

tak samo jak preg_replace ('/ search /', 'replace', $ str, 1); – Ben

+2

@Ben Funkcje są podobne, ale zdecydowanie nie są takie same. Jeśli użyjesz znaku, który musi zostać zmieniony przez wyrażenie regularne, otrzymasz niespodziewane błędy, jeśli użyjesz preg_replace. – Anther

+0

@mishu cały dzień zmarnowany, a następnie znalazłem twoją odpowiedź, stary kolego. –

-1

ltrim() usunie niechciany tekst na początku ciągu znaków.

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

ltrim() usuwa wszystkie znaki z podanej listy, a nie ciąg znaków. Zaktualizuj swoją odpowiedź. – Calin

0

wpadłem na ten problem i chciała rozwiązania, a to nie było 100% dla mnie, bo jeśli ciąg było jak $str = "mine'this The appostrophe spowodowałoby problem. więc wymyśliłem małą sztuczkę:

$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

Czy nie jest to najlepsze rozwiązanie pod względem zwartości i wydajności?

if(($offset=strpos($string,$replaced))!==false){ 
    $string=substr_replace($replaced,$replacer,$offset,strlen($replaced)); 
} 
Powiązane problemy