2016-12-05 2 views
4

Mit PHP preg_replace und regexalle Zeichen mit preg_replace mit Ausnahme einiger Nadeln

$string_1 = "leave sb. alone"; 
$string_2 = "pick one's way forward"; 
$string_2 = "suffer from sth."; 

ich brauche jede Zeichenfolge mit einem bestimmten Zeichen zu maskieren, aber lassen Sie das Leerzeichen, Apostroph und eine Schnur unberührt, wie:

$mask_1 = "XXXXX sb. XXXXX"; 
$mask_2 = "XXXX XXX'X XXX XXXXXXX"; 
$mask_2 = "XXXXXX XXXX sth."; 

In diesem Fall möchte ich behalten: sb. etw. Leerzeichen und Apostroph. Jede Hilfe würde sehr geschätzt werden.

mit $mask_1 = preg_replace('/(sb.\K)?./s', 'X', $string_1); Ich verlasse nur die 'sb.' aber Räume ändern sich noch.

PS: Sowohl @ Casimir et Hippolyte & @ Wiktor Stribiżew Antworten sind großartige Lösungen, aber ich nahm Wiktors für die SKIP-FAIL-Implementierung und Erklärung. Vielen Dank!

+0

Ok, gut. Also, was ist deine Frage? Sie möchten offensichtlich alle Zeichen außer einigen spezifischen und einigen Phrasen ersetzen. TU es. – arkascha

+0

@arkascha danke für die beratung. – Karls

Antwort

1

Sie können SKIP-FAIL regex verwenden:

'~(?:s(?:b|th)\.|[\s'])(*SKIP)(*F)|.~' 

Siehe regex demo

Einzelheiten:

  • (?:s(?:b|th)\.|[\s']) - Spiel s und dann entweder b (sb) oder th (sth), dann.210 oder Leerzeichen oder ' ([\s'])
  • (*SKIP)(*F) - das Spiel auslassen, und gehen Sie für das nächste Spiel vom Ende des angepassten Textes
  • | suchen - oder
  • . - entspricht einen char andere als ein Zeilenumbruch char (add DOTALL Modifikator Zeilenumbruch Zeichen auch passen)

Wenn Sie ganze Wörter müssen übereinstimmen, die Sie behalten möchten, vergessen Sie nicht, Wortgrenzen hinzuzufügen, \b (zB '~(?:\bs(?:b|th)\.|[\s'])(*SKIP)(*F)|.~').

+0

Vielen Dank und für die tolle Erklärung. Kannst du mich wissen lassen, wie ich auch die "sb.'s" Ausnahme hinzufügen kann? – Karls

+0

Fügen Sie es als Alternative hinzu, oder fügen Sie es als optionalen Teil hinzu, um 'sb' zu finden: [' '~ (?: \ Bs (?: B \. (?:' s)? | Th \.) | [\ S ']) (* SKIP) (* F) |. ~' '] (Https://regex101.com/r/KI2r8G/2) oder [' (?: \ Bsb \. (?: 's)? | \ bsth \. | [\ s ']) (* SKIP) (* F) | .'] (https://regex101.com/r/KI2r8G/3). –

1

können Sie diesen einen Test, der die Zeichen Ziele Sie wollen:

(?:\G|\b(?!sb\.|sth\.))[[:alnum:]] 

(Sie auch [[:alnum:]]-\w oder [^\W_] ändern können)

demo

oder diese eine, die überspringt mit \K die Zeichen, die Sie nicht wollen:

\G(?:\W*(?:\bs(?:b|th)\.)?)*+\K. 

demo

In den beiden Mustern gewährleistet \G die Kontiguität.

+0

Danke, sieht gut aus auf dem regex101.com, aber ich kann nicht in PHP preg_replace einbetten. Bitte beraten. – Karls

+0

@Karls: Regex101 hat eine Code-Generator-Funktion, klicken Sie auf den Link, um zu sehen, was Sie verpasst haben. die Begrenzer vielleicht? –

+0

'$ mask_1 = preg_replace ('/ \ G (?: \ W * (?: \ Bs (?: B | th) \.)?) * + \ K./gs', 'X', $ string_1) ; ' –

Verwandte Themen