2016-12-25 1 views
5

I letzte Vorkommen mindestens doppelt neuer Zeile (\ n \ n) in einem String ersetzen müssen, so sollte es sein \ n \ n oder \ n \ n \ n oder \ n \ n \ n \ n ein so weiter (mindestens 2 \ n) durch die "@@". Ich denke, dass es preg_replace sein sollte. Ich habe viele Optionen versucht, die in den Antworten hier auf stackoverflow sind, aber alle diese Optionen haben einige Fälle, die nicht abgefangen wurde. Ich habe regex101 Seite versucht, regulären Ausdruck vorzubereiten, aber ich bin nicht stark in diesem, so dass ich eine Lösung gefunden, die wie auf der Website (/((\\n){2,})+(?!.*((\\n){2,})+)/i) funktioniert aussehen, aber wenn ich es in meinem Code versuche, funktioniert ich nicht.letzte Auftreten mindestens doppelt neue Zeile ( n n) in string PHP

war Ein anderes ([\\n\\n])+(.[^\\n\\n])*$, aber dieser catched auch letzte nn

Die Test-String war:

Storage \ nDie leistungsstarken Prozessor Intel X5 Quad-Core in Transformer Buch T101HA bedeutet, dass Sie‘ Ich habe kein Problem damit, all Ihre täglichen Aufgaben zu erledigen, mit nahtlosem Multitasking, mit dem Sie in kürzerer Zeit mehr erledigen können. Die Lagerung ist auch sehr flexibel. Im Inneren befinden sich 128 GB superschneller Flash-Speicher, der über den microSD-Kartensteckplatz leicht erweiterbar ist. Sie erhalten auch ein Jahr frei unbegrenzten Cloud-Speicher auf ASUS WebStorage! \ N \ nFarbe | Weiß/Gold \ n \ n \ n \ n \ nCPU | Innn dsafdsfdfa \ n \ n \ n \ n \ n \ n \ n \ n dfnn

So sollte das Ergebnis sein:

Storage \ nDie leistungsstarken Prozessor Intel X5 Quad-Core in Transformer Buch T101HA bedeutet, dass Sie kein Problem durch alle Ihre täglichen breezing haben werden Aufgaben, \ nwith Seamless Multitasking ermöglicht es Ihnen, mehr in weniger Zeit zu erledigen. Die Lagerung ist auch sehr flexibel. Im Inneren befinden sich 128 GB superschneller Flash-Speicher, der über den microSD-Kartensteckplatz leicht erweiterbar ist. Sie erhalten Ihnen auch ein kostenlosen unbegrenzten Cloud-Speicher auf ASUS WebStorage Jahr \ n \ nColor | Weiß/Gold \ n \ n \ n \ n \ n \ NCPU | Innn dsafdsfdfa @@ dfnn

Kann jemand helfen Sie dabei und erklären Sie vielleicht zusätzlich die Logik der beantworteten Regex.

Vielen Dank.

+0

Beachten Sie, dass Sie dies mithilfe von [Gier] (http://www.regular-expressions.info/repeat.html#greedy) ohne Lookahead tun können. Suche nach ['/^.*\V\K\R{2,}/s'](https://www.regex101.com/r/zOmdJ5/1) und ersetze durch' @@ '. Das '. *' Wird bis zum letzten '\ V' * nicht-vertikalen Raum * auffressen, gefolgt von zwei oder mehr Zeilenumbrüchen' \ R'. ['\ K' setzt zurück] (http://www.rexegg.com/regex-php.html#K) Beginn der gemeldeten Übereinstimmung (legt fest, wo mit dem Ersetzen begonnen wird). Siehe [diese Demo bei eval.in] (https://eval.in/704280). –

Antwort

5

können Sie verwenden

/\n{2,}(?!.*\n{2})/s 

Siehe regex demo

Einzelheiten:

  • \n{2,} - 2 oder mehr Zeilenumbrüche
  • (?!.*\n{2}) - nicht gefolgt mit irgendwelchen 0+ Zeichen gefolgt mit 2 Zeilenumbrüchen.

Wenn ein Zeilenumbruch gemeint ist, ersetzen Sie \n durch \R.

+0

Vielen Dank, ich habe einige Änderungen vorgenommen, da ich festgestellt habe, dass meine Saite mit ** \ r ** vor jedem ** \ n ** kommt, also ist die endgültige Lösung in meinem Fall '/ (\ r \ n) { 2,} (?!. * (\ R \ n) {2})/s' – IncreMan

+0

Eigentlich ist das '\ R' praktisch -'/\ R {2,} (?!. * \ R { 2})/s', '\ R' entspricht allen Zeilenumbrüchen, CRLF, CR und LF. –

Verwandte Themen