2016-05-08 6 views
0

Was ist das effizienteste Muster dots in Punkt getrennte Zeichenfolge in einem Array-ähnlichen Zeichenfolge beispiel x.y.z -> x[y][z]Ist es möglich, "x.y.z" mit "regexp" in "x [y] [z]" zu konvertieren?

Hier ist mein aktueller Code zu ersetzen, aber ich denke, es sollte mit regexp eine kürzere Methode.

function convert($input) 
{ 
    if (strpos($input, '.') === false) { 
    return $input; 
    } 
    $input = str_replace_first('.', '[', $input); 
    $input = str_replace('.', '][', $input); 

    return $input . ']'; 

} 
+0

Muster nicht konvertieren *. – Maroun

+0

Mit preg_replace_callback() vielleicht –

+0

ersetzen Sie zuerst '.' Mit '[', andere Punkte mit '] ['. String-Funktionen reichen dafür aus. –

Antwort

5

In Ihrem speziellen Fall "ein Array-ähnliche Zeichenfolge" leicht preg_replace Funktion erhalten, lassen sich mit:

$input = "x.d.dsaf.d2.d"; 
print_r(preg_replace("/\.([^.]+)/", "[$1]", $input)); // "x[d][dsaf][d2][d]" 
+0

Ausgezeichnet. Vielen Dank. – PHPst

+0

@PHPst, gern geschehen – RomanPerekhrest

0

Von dem, was ich aus Ihrer Frage verstehen kann; "x.y.z" ist ein String und sollte also "x [y] [z]" sein, oder? Wenn das der Fall ist, Sie können dem folgenden Code-Schnipsel einen Versuch geben:

 <?php   
      $dotSeparatedString = "x.y.z"; 
      $arrayLikeString = ""; 
      //HERE IS THE REGEX YOU ASKED FOR... 
      $arrayLikeString = str_replace(".", "", preg_replace("#(\.[a-z0-9]*[^.])#", "[$1]", $dotSeparatedString)); 

      var_dump($arrayLikeString);  //DUMPS: 'x[y][z]' 

Hofft, es hilft Ihnen, obwohl ....

0

eine ziemlich einfache preg_replace_callback() verwenden, die einfach zurückkehrt ein anderer Ersatz für das erste Auftreten von . im Vergleich zu den anderen Vorkommen.

$in = "x.y.z"; 

function cb($matches) { 
    static $first = true; 
    if (!$first) 
     return ']['; 
    $first = false; 
    return '['; 
} 

$out = preg_replace_callback('/(\.)/', 'cb', $in) . ((strpos('.', $in) !== false) ? ']' : ']'); 
var_dump($out); 

Der ternäre append ist der Fall ohne . zu handhaben

0

bereits beantwortet zu ersetzen, aber man konnte einfach auf die Zeit explodieren Begrenzer dann eine Zeichenfolge rekonstruieren.

$in = 'x.y.z'; 

$array = explode('.', $in); 

$out = ''; 

foreach ($array as $key => $part){ 
    $out .= ($key) ? '[' . $part . ']' : $part; 
} 

echo $out; 
Verwandte Themen