2010-11-21 14 views
1

Was ist der richtige Weg in PHP mit der Decodierung Strings zu beschäftigen, wie diese:Decoder für Backslash-Escape-Sequenzen

Test1 \\ Test2 \n Test3 \\n Test4 \abc 

Die gewünschte Ausgabe ist:

Test \ Test2 (linebreak) Test3 \n Test4 abc 

Eine Sache, die ich habe versuchte, war:

str_replace(array('\\\\','\\n','\\'), array('\\',"\n",''), $str); 

Aber das funktioniert nicht, weil es das ersetzen zweimal laufen, was bewirkt, dass:

\\n 

Entschlüsselt sowieso als Zeilenumbruch.

So dachte ich so etwas wie diese:

$offset = 0; 
$str = 'Test1 \\\\ Test2 \\n Test3 \\\\n Test4 \\abc'; 
while(($pos = strpos($str,'\\', $offset)) !== false) { 

    $char = $str[$pos+1]; 
    if ($char=="n" || $char=="N") { 
    // Insert a newline and eat 2 characters 
    $str = substr($str,0,$pos-1) . "\n" . substr($str,$pos+2); 
    } else { 
    // eat slash 
    $str = substr($str,0,$pos-1) . substr($str,$pos+1); 
    } 
    $offset=$pos+1; 

} 

Dies scheint zu stehen, aber ich frage mich, ob es vielleicht ein eingebauter, das tut genau dies und ich völlig verfehlt es, oder ein bessere/mehr kompakter Weg, um dies zu tun.

Antwort

2

stripcslashes()fast funktioniert, außer, dass sie nicht erkennen \ a und überspringt es :(

$str = 'Test1 \\\\ Test2 \\n Test3 \\\\n Test4 \\abc'; 
echo stripcslashes($str); 

gibt diese ...

Test1 \ Test2 
Test3 \n Test4 bc 
+0

Dies könnte ein Anwärter auf nahe genug sein :) Bin mir nicht sicher ob ich die \ a Syntax trotzdem brauche. – Evert