Zeichen in String einfügen

Alice

Erfahrenes Mitglied
Hallo, ich sitze gerade an einer etwas schwierigeren Sache.

Vielleicht kann mir jemand helfen?

Ich habe eine Variable:
PHP:
$var1 = 'B!MW50!0P!S';

Nun möchte ich zwischen allen Buchstaben und Zahlen ein Sonderzeichen einfügen, jedoch sollen die Ausrufezeichen nicht gelten.

Ich würde es zwar mit "chunk_split" machen, aber das funkioniert wegen den den Ausrufezeichen nicht.

Das ganze soll so aussehen:
PHP:
$var1 = 'B!MW50!0P!S';

Sonderzeichen: @

$var1 = 'B@!M@W@5@0@!0@P@!S';

Zur Verdeutlichung:
B | @ | !M | @ | W | @ | 5 | @ | 0 | @ | !0 | @ | P | @ | !S

Ich denke das ist mit PHP nicht möglich aber vielleicht hat ja jemand von euch eine Idee?
 
Mit Regulären Ausdrücken kannst Du das machen. Einen Link dazu hatte ich in deinem anderen Thread geposted.

Gruß
 
PHP:
$pattern = '/([[:alnum:]])|([@])|!([[:alnum:]])/';
$subject = 'B@!M@W@5@0@!0@P@!S';
$result  = array();

if(preg_match_all($pattern, $subject, $matches) !== false) {
  foreach($matches[1] as $i => $match) {
    if($matches[1][$i] !== '') {
      # Ziffern und Buchstaben
      $result[] = array($matches[1][$i], 0);
    } elseif($matches[2][$i] !== '') {
      # At-Zeichen
      $result[] = array($matches[2][$i], 1);
    } else {
      # Ziffern und Buchstaben mit führendem Ausrufezeichen
      $result[] = array($matches[3][$i], 2);
    }
  }
}
Nebenbei: Warum eröffnest du a) immer wieder neue Threads, wenn es doch immer um das gleiche Problem geht, und warum erstellst du b) keinen Thread im Jobforum, obwohl wir dir doch bisher eigentlich alles erarbeitet haben und du es danach nur noch kopieren musstest?
 
@enfach nur Crack:
Er will das Sonderzeichen einfügen - nicht entfernen.

PHP:
$var1 = 'B!MW50!0P!S';

// Pattern erstellen. Nimme soviele Nichtzahlen und NichtBuchstaben wie es hat 
// gefolgt von einer Zahl oder einem Buchstaben
$pattern = '/([^[:alnum:]]*[[:alnum:]])/';

preg_match_all($pattern, $var1, $results);

// Und die ganze Menge wieder mit @ zusammenführen
$newVar1 = implode('@', $results[1]);

var_dump($newVar1);

//Ausgabe:
// string(18) "B@!M@W@5@0@!0@P@!S"

Mann kann es auch mit preg_replace machen:
PHP:
// gleicher Pattern
$pattern = '/([^[:alnum:]]*[[:alnum:]])/';
// Ersetze jeden Fund durch Fund@
$replace = '\1@';
$newVar1 = preg_replace($pattern, $replace, $var1); 
// Am Schluss vom String das überflüssige @ entfernen
$newVar1 = rtrim($newVar1, '@');

var_dump($newVar1);

Mit dem anderen stimme ich dir bei. Ich habe schon lange die Übersicht über bl5000 seine 5000 Threads verloren.
 
Bitte seit nicht zu Streng mit mir.

Ich habe den Thread extra erstellt, um eben die Übersichtlichkeit behalten zu können. Sorry!

@Yaslaw:
Danke für deinen Code. Jedoch erzeugt es bei mir ganz unterschiedliche Ausgaben.

Beispiel:
PHP:
$var1 = 'DD';

... Dein Code...

echo $newVar1:

Ausgabe:
string(3) "D@D" D@DDD

Stehen sollte da eigentlich:
D@D

Beispiel:
PHP:
$var1 = 'F';

... Dein Code...

echo $newVar1:

Ausgabe:
string(1) "F" FF

Stehen sollte da eigentlich:
F

Beispiel:
PHP:
$var1 = 'ABC';

... Dein Code...

echo $newVar1:

Ausgabe:
string(5) "A@B@C" A@B@CABC

Stehen sollte da eigentlich:
A@B@C

Beispiel:
PHP:
$var1 = '!AG';

... Dein Code...

echo $newVar1:

Ausgabe:
string(4) "!A@G" !A@G!AG

Stehen sollte da eigentlich:
!A@G
 
Welchen dein Code? Ich habe 2 Codes.

Alle deine Beispiele funktionieren bei mir perfekt.

Warum testest du mit einem echo und meinem var_dump()? So gibt es eine doppelte Ausgabe

Hast du nur einfach alles kopiert ohne zu versuchen was dans ganze so im groben macht? Das du die Pattern nicht versteht ist das eine. Aber die var_dump() im Code, die solltest du schon verstehen.

Ich habe jetzt mal alles zusammengefasst und die 2 Versionen in getrennte Funktion verpackt
PHP:
// Meine Tests
$testStrings = array(
        'B!MW50!0P!S',
        'DD',
        'F',
        'ABC',
        '!AG'
);

// Für jeden Teststring beide Versionen ausgeben
foreach($testStrings AS $text){
    echo "Orignaltext: {$text}<br />\n";
    echo 'Version 1: ' . getNewTextVersion1($text) . "<br />\n";
    echo 'Version 2: ' . getNewTextVersion2($text) . "<br />\n";
    echo "<hr />\n";
}


function getNewTextVersion1($text){
    // Pattern erstellen. Nimme soviele Nichtzahlen und NichtBuchstaben wie es hat 
    // gefolgt von einer Zahl oder einem Buchstaben
    $pattern = '/([^[:alnum:]]*[[:alnum:]])/';
    
    preg_match_all($pattern, $text, $results);
    
    // Und die ganze Menge wieder mit @ zusammenführen
    return implode('@', $results[1]);
}

function getNewTextVersion2($text){
    // gleicher Pattern
    $pattern = '/([^[:alnum:]]*[[:alnum:]])/';
    // Ersetze jeden Fund durch Fund@
    $replace = '\1@';
    $retVal = preg_replace($pattern, $replace, $text); 
    // Am Schluss vom String das überflüssige @ entfernen
    return  rtrim($retVal, '@');
}

Das ergibt:

In HTML-Ansicht:
HTML:
Orignaltext: B!MW50!0P!S<br />
Version 1: B@!M@W@5@0@!0@P@!S<br />
Version 2: B@!M@W@5@0@!0@P@!S<br />
<hr />
Orignaltext: DD<br />
Version 1: D@D<br />
Version 2: D@D<br />
<hr />
Orignaltext: F<br />
Version 1: F<br />
Version 2: F<br />
<hr />
Orignaltext: ABC<br />
Version 1: A@B@C<br />
Version 2: A@B@C<br />
<hr />
Orignaltext: !AG<br />
Version 1: !A@G<br />
Version 2: !A@G<br />
<hr />

In Browser-Ansicht:
Code:
Orignaltext: B!MW50!0P!S
Version 1: B@!M@W@5@0@!0@P@!S
Version 2: B@!M@W@5@0@!0@P@!S

Orignaltext: DD
Version 1: D@D
Version 2: D@D

Orignaltext: F
Version 1: F
Version 2: F

Orignaltext: ABC
Version 1: A@B@C
Version 2: A@B@C

Orignaltext: !AG
Version 1: !A@G
Version 2: !A@G
 
Ne ich habe mir natürlich beide Codes angeschaut und die Zeile mit dem var_dump auskommentiert weil ich hier den Fehler vermutet habe.

Mit
PHP:
echo $Var1;
bekomme ich ja die Variabele normal angezeigt.

Mit
PHP:
echo $newVar1;
eben nicht.

Wie kriege ich
PHP:
$newVar1
denn "Echo-Fähig"?
 
Zuletzt bearbeitet:
Ganz normal. Aber du hast irgendwie meinen Code irgendwohin zusammenkopiert und irgendwie angepasst und erwartest jetzt vollem Ernst, dass ich dir einfach so sagen kann was du falsch gemacht hast?

Es ist die Zeile 42.
 
He? ich habe nur die Zeile mit dem "var_dump" auskommentiert.

PHP:
$var1 = 'B!MW50!0P!S';
$pattern = '/([^[:alnum:]]*[[:alnum:]])/';
preg_match_all($pattern, $var1, $results);
$newVar1 = implode('@', $results[1]);
//var_dump($newVar1);

echo $newVar1;
 
Zurück