2017-11-09 5 views
0

Müssen alle Zeichen in einer Zeichenkette ersetzen, mit Ausnahme von allen, die am Anfang einer Zeichenkette (oder eines Teils eines Wortes) stehen.preg_replace alle Ziffern- und Sternzeichen außer beim Start der Zeichenkette

Zum Beispiel Eingabe:

MSFT *<E07004QY6W> 
WOOLWORTHS W1157 
GOOGLE*ADWS7924436927 
COLES 0829 
ROBLOX.COM 888-858-25 
7-ELEVEN 2179 
COLES EXPRESS 1896 

Ergebnis sein sollte:

MSFT 
WOOLWORTHS 
GOOGLE 
COLES 
ROBLOX.COM 
7-ELEVEN 
COLES EXPRESS 

können dank PHP preg_replace dies erreichen?

bisher versucht:

  • '/ \ d +/g' - aber es entfernt alle Ziffern und nichts anderes
  • '/ (* | \ d + $) /' - aber das tut nicht ganz Arbeit auf einige, führt zu „ROBLOX.COM 888-858-“
+4

Bitte aktualisieren Sie die Frage mit, was Sie bisher versucht haben. – Rahul

+0

Sehen Sie sich dies als Anfang an: '([a-zA-Z0-9 \. \ -] +). + \ N' https://regex101.com/r/EtgztL/1/ Das Problem ist, "COLES EXPRESS" ohne Übereinstimmung "WOOLWORTHS W1157" zu entsprechen. – datagutten

+0

Ja, 'preg_replace' könnte das mit der richtigen Regex machen. – chris85

Antwort

3

nicht sicher, dass dies für andere Rand Fällen funktionieren, aber Sie können mit diesem Ersatz versuchen:

$txt = preg_replace('~^[^*\s]+(?: \pL+(?!\S))*\K.*~m', '', $txt); 

demo

Erläuterungen:

^[^*\s]+ nimmt all das ist kein Raum oder ein Sternchen am Anfang der Zeile.
(?: \pL+(?!\S))* und schließlich eine Gruppe von Buchstaben, die durch Leerzeichen getrennt sind.
\K entfernt alle vorherigen übereinstimmenden Zeichen aus dem Übereinstimmungsergebnis.
.* übernimmt alle verbleibenden Zeichen, die ersetzt werden.

+0

Schön! Vielen Dank. – Ben

0
$in = array(
    'MSFT *<E07004QY6W>', 
    'WOOLWORTHS W1157', 
    'GOOGLE*ADWS7924436927', 
    'COLES 0829', 
    'ROBLOX.COM 888-858-25', 
    '7-ELEVEN 2179', 
    'COLES EXPRESS 1896', 
); 

foreach ($in as $str) { 
    echo preg_replace('/[\h*]+[^\h*]+$/', '', $str),"\n"; 
} 

Ausgang:

MSFT 
WOOLWORTHS 
GOOGLE 
COLES 
ROBLOX.COM 
7-ELEVEN 
COLES EXPRESS 
Verwandte Themen