2017-10-24 2 views
0

Wie kann ich löschen, wenn Wort im Text in falscher Form kombiniert. Zum Beispiel habe ich diesen Text:Wie löschen Sie mit Hilfe von Regex Leerzeichen zu falschen kombinierten Wörtern im Text?

 
HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо. 
HELLOeveryOneHelloFORyouYOU HELLO everyOneHello FORyouYOU 
canBEcorrectedThisSTRINGinCorrectlyFORm 
canBEcorrected ThisSTRINGin CorrectlyFORm 
 
Hello Every One, Салом Ба Хама, Ҳама дар Пеши ҷаҳон Як мебошад Аммо. 
HELLO every One Hello FOR you YOU HELLO every One Hello FOR you YOU 
can BE corrected This STRING in Correctly FOR m 
can BE corrected This STRING in Correctly FOR m 

Dank schonmal!

+0

Sie alle Wörter mit einem Großbuchstaben beginnen? –

+0

Ja! Zum Beispiel, wenn Word mit Großbuchstaben beginnt und mit Groß- oder Kleinbuchstaben und Großbuchstaben kombiniert wird. Beispiel. 'ArrayFunction' oder' ArrayFunction' – John

Antwort

-2

ich diese locale nicht erkennen, so war ich nicht in der Lage, diese seltsame Zeichen zu testen, aber die erste Saite kann mit dieser gelöst werden:

<?php 

$str = 'HelloEveryOne'; 
$newStr = ''; 

for ($i = 0; $i < strlen($str); $i++) { 
    $newStr .= ctype_upper($str[$i]) ? ' ' : ''; 
    $newStr .= $str[$i]; 
} 

echo $newStr; 

Die ctype_upper Funktion zurückgibt, wenn eine Zeichenkette alle Zeichen hat in Großbuchstaben. Ich gebe ein einzelnes Zeichen nach dem anderen, also wenn es in Großbuchstaben geschrieben ist, fügt das Programm ein Leerzeichen vor dem Zeichen ein.

+0

Danke für die Antwort. Aber ich brauche Text und nicht ein Wort. Ich muss Ergebnis mit 'preg_replace()' @ Vinicius Dias bekommen – John

+0

Es funktioniert für mehr als eine Arbeit @ John. Sie müssen nur das richtige Gebietsschema festlegen. –

2

Sie können die unicode metacharacters verwenden, um nach Groß- und Kleinbuchstaben zu suchen. Etwas wie:

\B(\p{Lu}[\p{Ll}.,!]+) 

und ersetzen mit

\1 

Regex Demo: https://regex101.com/r/QskwDd/2/

in PHP kann es verwendet werden, wie:

$string = 'HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо.'; 
echo preg_replace('/\B(\p{Lu}[\p{Ll}.,!]+)/u', ' \1', $string); 

Demo: https://3v4l.org/ZjHh4

Ein einfacherer Ansatz könnte nur nach Großbuchstaben suchen und ein Leerzeichen hinzufügen.

\B\p{Lu} 

ersetzen mit:

\0 

Regex Demo: https://regex101.com/r/QskwDd/1/

+0

+1 für antwort @ chris85 aber es funktioniert ein wenig falsch für mich. Zum Beispiel habe ich Beispiel eingegebener Text: 'HElloEveryBody inINCORRECT ORthISTEXT' Ich muss in diesen Momenten kommen, um folgendes Ergebnis zu erhalten:' HE llo Every Body in FALSCH ODER DIESER TEXT 'In solch einem Fall musst du hinzufügen, wo rechts ein großer Buchstabe steht und auf der linken Seite ein kleiner Brief oder umgekehrt. Im Allgemeinen müssen Sie einen Platz hinzufügen, wo sich der Fall ändert – John

+0

Ein anderer Beispieltext: 'SimPleTEXTor HyperTexTmarkUPlanguAg' Wie kann ich Einfaches Ergebnis erhalten:' Sim Ple TEXT oder Hyper Tex Tmark UP Sprache Ag' Oder ist das nicht möglich? @ chris85 – John

+0

@John Es wird ein bisschen schwieriger, können Sie die Frage mit 5 Beispielstrings aktualisieren, die erwarteten Ergebnisse und definieren Sie die Regeln. Die ursprüngliche Regel war, nach einem Großbuchstaben zu brechen. – chris85

1

Dies war zu knacken ein bisschen tricky Herausforderung! ... aber ich habe es. Negative Lookarounds erwiesen sich als unbrauchbar, um unerwünschte Teilstrings zu negieren. Die (*SKIP)(*FAIL) Technik hat den Job gemacht.

Die Logik dahinter besteht darin, die drei Arten von Wörtern unabhängig vom Abstand anzusprechen. Sie sind:

  • Klein
  • Titlecase
  • Alle Versalien-

Siehe die Inline-Kommentare im PHP-Code-Block für Laien Muster Erklärung.

Muster: Demo

/(?:\p{Ll}+|\p{Lu}\p{Ll}+|\p{Lu}{2,}+)[,.!?]?(?:\s|$)(*SKIP)(*FAIL)|(?:\p{Ll}+|\p{Lu}{2,}+|\p{Lu}\p{Ll}+)[,.!?]?/u 

Code: (Demo)

$input='HelloEveryOne, СаломБаХама, Ҳама дарПеши ҷаҳонЯк мебошадАммо. 
HELLOeveryOneHelloFORyouYOU HELLO everyOneHello FORyouYOU 
can,BEcorrectedThisSTRINGinCorrectlyFORm 
canBEcorrected ThisSTRINGin CorrectlyFORm.'; 

//        optional trailing punctuation-vvvv  vvvv- white space or end of input (that we don't want to replace) 
var_export(preg_replace('/(?:\p{Ll}+|\p{Lu}\p{Ll}+|\p{Lu}{2,}+)[,.!?]?(?:\s|$)(*SKIP)(*FAIL)|(?:\p{Ll}+|\p{Lu}{2,}+|\p{Lu}\p{Ll}+)[,.!?]?/u','$0 ',$input)); 
//     all lower-^^^^^^^    ^^^^^^^^^^^-all upper      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^-repeat first alternative without trailing white space or end of input 
//   one upper then all lower-^^^^^^^^^^^^^       ^^^^^^^^^^^^^^-discard these matches 

Ausgang:

'Hello Every One, Салом Ба Хама, Ҳама дар Пеши ҷаҳон Як мебошад Аммо. 
HELLO every One Hello FOR you YOU HELLO every One Hello FOR you YOU 
can, BE corrected This STRING in Correctly FOR m 
can BE corrected This STRING in Correctly FOR m.' 
+1

Ah, knifflig. Schön gemacht. – chris85

+0

@John hat dies für Ihr aktuelles Projekt getan? – mickmackusa

Verwandte Themen