2012-10-02 14 views
5

Co chcę zrobić, to znaleźć wszystkie spacje, które są zamknięte w nawiasy klamrowe, a następnie zastąpić je inną postacią.Zastąp wszystkie spacje, które są zamknięte w nawiasach klamrowych.

Coś jak:

{The quick brown} fox jumps {over the lazy} dog 

Aby zmienić na:

{The*quick*brown} fox jumps {over*the*lazy} dog 

już wyszukiwane w Internecie, ale tylko to, co mam do tej pory, i wydaje się tak blisko tego, co naprawdę chcę .

preg_replace('/(?<={)[^}]+(?=})/','*',$string); 

Mój problem z powyższego kodu jest to, że zastępuje wszystko:

{*} fox jumps {*} dog 

szukałem do wyrażeń regularnych ćwiczeń, aby dowiedzieć się w jaki sposób należy zmodyfikować powyższy kod, aby tylko wymienić przestrzenie ale bezskutecznie . Wszelkie dane wejściowe będą bardzo cenne.

Dzięki.

+1

Wystarczy ciąg eksplodować pomiędzy przestrzeniami a następnie otrzymaną tablicę kota z powrotem razem z „*” pomiędzy. Przepraszam, jestem zbyt zmęczony, by napisać przykład. – noel

Odpowiedz

5

Zakładając, że wszystkie szelki są prawidłowo zagnieżdżone, i że nie istnieją żadne zagnieżdżone szelki, można to zrobić za pomocą twierdzenia uprzedzoną:

$result = preg_replace('/ (?=[^{}]*\})/', '*', $subject); 

Dopasowuje i zastępuje miejsce tylko wtedy, gdy obok klamra jest zamknięcie klamra:

(?=  # Assert that the following regex can be matched here: 
[^{}]* # - Any number of characters except braces 
\}  # - A closing brace 
)  # End of lookahead 
+0

Dziękuję. To działało znakomicie. Jednak próbuję rozwiązania za pomocą funkcji ciąg php (strpos, substr, itp.). Czy nadal radzisz używać wyrażenia regularnego? Czytałem o regex jest powolny i takie. – Bibokid

+2

@Bibokid: Można profil Zaffy i moje rozwiązanie i dowiedzieć się - wyrażenia regularne niekoniecznie są powolne (ale często są one skonstruowane bardzo niechlujnie, co im wolno, bo mają do brute-force rozwiązanie, gdy sprytny rozwiązaniem jest również dostępna) . W wielu przypadkach biblioteki regex są wysoce zoptymalizowane i mogą być znacznie szybsze niż jakiekolwiek rozwiązanie, które sam konstruujesz przy użyciu funkcji łańcuchowych. –

1

Jak ten temat:

$a = '{The quick brown} fox jumps {over the lazy} dog'; 
$b = preg_replace_callback('/\{[^}]+\}/sim', function($m) { 
    return str_replace(' ', '*', $m[0]); 
}, $a); 
var_dump($b); // output: string(47) "{The*quick*brown} fox jumps {over*the*lazy} dog" 
+0

Dzięki. Spróbuję tego również i porównuję z innymi rozwiązaniami. – Bibokid

2

mam reagować na yo ur komentarz, że nie chcesz używać regex, tylko manipulacji ciąg. To jest w porządku, ale dlaczego napisałeś, że szukasz wyrażeń regularnych?

Rozwiązanie wihout regex:

<?php 

$str = "{The quick brown} fox jumps {over the lazy} dog"; 

for($i = 0, $b = false, $len = strlen($str); $i < $len; $i++) 
{ 
    switch($str[$i]) 
    { 
     case '{': $b = true; continue; 
     case '}': $b = false; continue; 
     default: 
     if($b && $str[$i] == ' ') 
      $str[$i] = '*'; 
    } 
} 

print $str; 

?> 
+0

To było tak, że gdy czekałem na odpowiedź tutaj w stackoverflow, eksperymentowałem z rozwiązaniem bez regexu, które przyszło mi do głowy. Dziękuję za to, spróbuję też. – Bibokid

Powiązane problemy