2017-03-04 2 views
3

Ich versuche, eine Funktion zu schreiben, die aufeinanderfolgende doppelte Wörter innerhalb einer Zeichenfolge entfernt. Es ist wichtig, dass einer der Übereinstimmungen, die durch den regulären Ausdruck gefunden werden, erhalten bleibt. Mit anderen Worten ...Entfernen von aufeinander folgenden doppelten Wörtern in einer Zeichenfolge

Ein sehr sehr sehr schmutziger Hund

sollte geworden ...

Ein sehr schmutziger Hund

Ich habe einen regulären Ausdruck das scheint gut zu funktionieren (based on this post)

(\b\S+\b)(($|\s+)\1)+ 

Allerdings bin ich nicht sicher, wie preg_replace zu verwenden ist (oder ob es eine bessere Funktion gibt), dies zu implementieren. Im Moment habe ich es alle übereinstimmenden wiederholten Wörter löschen, ohne eine Kopie des Wortes intakt zu lassen. Kann ich eine Variable oder eine spezielle Anweisung analysieren, um eine Übereinstimmung aufrechtzuerhalten?

Ich habe dies zur Zeit ...

$string=preg_replace('/(\b\S+\b)(($|\s+)\1)+/', '', $string); 
+0

Beachten Sie, dass es keinen Sinn macht, '$' im Wechsel zu verwenden, da '$ \ 1' niemals übereinstimmt (Sie verwenden nicht einmal den Multiline-Modifikator.) –

Antwort

3

Sie einen regulären Ausdruck wie \b(\S+)(?:\s+\1\b)+ verwenden und ersetzen mit $1:

$string=preg_replace('/\b(\S+)(?:\s+\1\b)+/i', '$1', $string); 

Siehe regex demo

Einzelheiten:

  • \b(\S+) - Gruppe 1 die Erfassung ein oder mehrere nicht-Leerzeichen Symbole, die mit einer Wortgrenze voraus sind (vielleicht wäre \b(\w+) besser paßt hier)
  • (?:\s+\1\b)+-1 oder mehr Sequenzen von:
    • \s+ - 1 oder mehrere Leerzeichen
    • \1\b - ein Rückverweis auf den Wert, gespeichert in Gruppe 1-Puffer (der Wert muss ein ganzes Wort)

Das Ersatzmuster ist $1, die Ersatzrückreferenz, die sich auf den in Gruppe 1-Puffer gespeicherten Wert bezieht.

Beachten Sie, dass /i Groß- und Kleinschreibung Modifikator \1 Fall unempfindlich machen, und I have a dog Dog DOG in I have a dog führen.

+0

Danke Wiktor! Zur Klarstellung, mein vorheriger Ausdruck erfasste auch Wörter mit verschiedene Fälle, so dass das für einige nützlich sein kann und es wert ist, auf den Rekord zu setzen – AdamJones

+0

Ich glaube, dass meine ursprüngliche Regex mit verschiedenen verkleinerten Wörtern arbeitet.Also "sehr sehr sehr" würde auch erwischt werden – AdamJones

+0

Ah ok ... Ich habe gerade versucht, die Arbeitsdemo und es scheint nicht zu tun – AdamJones

0
<?php 
$text ='one one, two three, two'; 
$result_text = preg_replace("/\b(\w+)\s+\\1\b/i", "$1", $text); 
echo "Result Text: ".$result_text; //one, two three, two 
?> 

Versuchen Sie dies. Es sollte eine Kopie intakt zurückgeben.

+0

Es ist eine helle Version meiner Lösung ohne mehr als 1 doppelte Wortunterstützung. –

Verwandte Themen