Autor Beitrag
trm
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 05.06.13 20:37 
Huhu,

bevor ich mir jetzt eine eigene Function schreibe, gibt es für folgendes Problem eine Lösung?

Per Formular übertragener String ist z.B. ' aaaaaaaa '.

Da ich in einem Pflichtfeld aber nur ein a benötige und dies den Textfluss stören kann, wenn eine Zeichenfolge so ankommt (per E-Mail), würde ich das also auf ein Zeichen trimmen.

Gibt es für soeas schon eine fertige PHP-Lösung?

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 05.06.13 20:45 
ausblenden Quelltext
1:
2:
 if length(Text)>=1 then Zeichen := Text[1]
else Zeichen := '';

Wenn also der übergebene String (Text) länger(gleich)als 1 Zeichen ist, dann ist das Zeichen das erste Zeichen des Textes.

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 05.06.13 20:54 
Und sonst, schau dir mal
php.net/manual/en/function.substr.php
an, hier wird erklärt, wie man per substr( Text, abZeichenNr, bisZeichenVorEnde) zeichen holt ;)

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 05.06.13 21:16 
Hi IhopeonlyReader,

leider am Thema vorbei.

Ich möchte nicht irgend einen String auf 1 Zeichen kürzen, sondern nur [n] Zeichen, welche gleichfolgend sind.

n = bliebiges Zeichen außer #32

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
IhopeonlyReader
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 600
Erhaltene Danke: 23


Delphi 7 PE
BeitragVerfasst: Mi 05.06.13 21:33 
und außer #0 denke ich ;)
Aber die Methode funktioniert doch trotzdem :D

Wenn du es "kompliziert" machen willst, erstelle ein Array of Byte(1..255) und gehst Zeichen für Zeichen durch und erhöhst das Array nur den Index [Ord(Zeichen)], endgültig setzt du das Zeichen mit der "höchsten wert" als DAS zeichen...

Aber da du ja nur ein Zeichen willst, und ja der ganze Text aus ein und demselben Zeichen besteht, kannst du einfach IRGENDein Zeichen aus dem String nehmen und es als DAS Zeichen verwenden
ausblenden Quelltext
1:
 Zeichen := Text[1]					

Dass es nicht "irgendein" string ist, sondern aus immer ein und demselben Zeichen besteht, ist dabei vollkommen egal !
Was stellst du dir denn vor? Es muss nuneinmal "in den String geschaut werden"

_________________
Sucht "neueres" Delphi :D
Wer nicht brauch was er hat, brauch auch nicht was er nicht hat!
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 05.06.13 22:45 
Hm, entweder kann ich Deinen Antworten nicht folgen oder Du mir nicht oder aber, wir sind wirklich bei zwei verschiedenen Themen.

Woher soll ich denn wissen, was ein Benutzer mir als String zuwirft?

Ich kann doch nicht davon ausgehen, dass die Zeichenfolge wirklich aus ein und dem selben Zeichen in beliebiger Stringlänge besteht.

Wenn z.B. jemand in ein Inputfeld eingibt: aaaaaaaa ist das was anderes als wenn er eingibt: wwwwwwwwwww.de (gibt es wirklich)

Also nochmal: ich suchte eine fertige Lösung, die mir im Erfolgsfall ein True zurückgibt, wenn ein String komplett aus ein und dem selben Zeichen besteht.

Und danke für die Schleife, aber ich fragte wirklich - ach lies einen Satz über diesem ;)

Gruß Mathias

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 864
Erhaltene Danke: 143

Win7
VS 2013, VS2015
BeitragVerfasst: Mi 05.06.13 22:52 
Probiere mal soetwas:
ausblenden PHP-Quelltext
1:
preg_replace('%(\w)\\1+%i''$1'$zeichenkette);					

Das sollte zwei oder mehr Buchstaben, die aufeinanderfolgen, zu einem verkürzen. Wenn du das nur möchtest, falls der gesamte string ausschließlich aus den gleichen Buchstaben besteht, einfach noch der regex in ^$ klammern:
ausblenden PHP-Quelltext
1:
preg_replace('%^(\w)\\1+$%i''$1'$zeichenkette);					
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Mi 05.06.13 23:24 
Hallo jfheins,

die Varianten funktionieren perfekt für mein Vorhaben.

Jedoch habe ich noch eine Bitte.

Wie muss ich das erste Muster abändern, damit nicht ab 2, sondern z.B. erst ab 4 multiplen Zeichen eine entsprechende Anpassung vorgenommen wird?

Z.B. ist es ja üblich, www.blubblah.de anzugeben. Bei Deinem Tipp würde dann herauskommen: w.blublah.de -> zwei w und ein b fehlen.

Generell benötige ich zwar nur die zweite Möglichkeit, jedoch möchte ich gern dazu lernen und leider begreife ich die Suchmuster einfach nicht. Je länger die werden (siehe php.net - Beispiele), desto mehr komme ich durcheinander. Eine Übersicht (in deutsch für besseres Verständnis) der einzelnen Musterzeichen ( /, (, \, d+, .... ) wäre für mich ganz angenehm :D

Danke und liebe Grüße
Mathias


Edit:

Ich glaube, ich habe die Lösung gefunden ( www.tutorials.de/con...sdruecke-teil-2.html )

Mein Muster sollte mit %(\w)\\{4,}+%i funktionieren.

Danke für die Hilfe :)

Edit2:

Ha, zu früh gefreut. Funktioniert so nicht. Erklär bitte mal :)

Moderiert von user profile iconMartok: Selbstquoteeditfehler zusammengefasst

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 864
Erhaltene Danke: 143

Win7
VS 2013, VS2015
BeitragVerfasst: Mi 05.06.13 23:55 
Tjaaaa ^^

(\w)\\1+ steht erstmal für (wortzeichen) gefolgt von einer backreference (also "das gleiche Zeichen von eben") und das dann eben 1 Mal oder öfter.

Du hast die 1 weggelassen, damit hast du nur noch einen Backslash gesucht und keine backreference mehr.... dein regex für 4 oder mehr Vorkommen lautet also %(\w)\\1{4,}%i ;-)

Übrigens eine tolle Seite zum testen: regexpal.com/
Dort besteht eine backreference aber nur aus einem backslash und der Zahl:, und es braucht auch keine Begrenazer mehr: (\w)\1{4,}


Zuletzt bearbeitet von jfheins am Do 06.06.13 12:15, insgesamt 1-mal bearbeitet
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 10:52 
Huhu.

Danke für die Erklärung.
Somit kann ich gedanklich also das Muster wie folgt in Worten definieren:

%(\w)\\1{4,}+%i

% 1. Begenzer des Musters
( Start des Musters als kompletten String
\ Nachfolgendes Zeichen nicht als normales Charzeichen nutzen
w - keine Ahnung, aber ich tippe mal auf einen Typ, evlt. Widechar?
) Beenden des Strings als ganzes zu erkennen, d.h., das Muster ist hier zu Ende
\ wie oben
\ keine Ahnung, warum jetzt noch eine Escapezeichenmaskierung kommt
1 das ist aus Deiner Erklärung noch in Erinnerung ;)
{ hier startet ein Ausdruck
4 Aha, da ist die 4, mit der eine Art Initialwert festgelegt wird, also erst ab dem 5. identischen Zeichen in Folge wird das Muster angewandt
, Hm, ein Komma für eine weitere Abgrenzung
Nach dem Komma benötigen wir keinen Maximalwert der aufeinanderfolgenden Zeichen, somit fällt dieser Wert weg, könnte aber evtl. auch als -1 eingetragen werden
} Ende des Ausdrucks der Begrenzung
+ Das soll also eine Art Schleife sein, denke ich, mit der das Suchmuster an sich unendlich multipliziert wird (maximale Länge = Stringlänge)
% 2. Begrenzung des Musters und der Begrenzungen
i Klein/Großschreibungsoll nicht beachtet werden

Hm, ist das so in etwa richtig?

Gruß
Mathias :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Martok
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Moderator
Beiträge: 3655
Erhaltene Danke: 594

Win XP x86, Win 8.1 x64
Lazarus Snapshot; Delphi 7,2007,XE; PHP (PHPEdit,PhpStorm); JS; Java(Eclipse)
BeitragVerfasst: Do 06.06.13 11:21 
() ist eine Gruppe. Auf eine Gruppe kannst du dann per Backreference (und auch in deinem Code, wenn du die Matches auswerten willst) zugreifen.
\w ist eine sogenannte Zeichenklasse, hier: word-character. Buchstaben, Zahlen und Unterstrich, alternativ könnte man also auch [a-zA-Z0-9_] schreiben.

{4,} bedeutet tatsächlich "mindestens 4, maximal unendlich". Das + dahinter erschließt sich mir grad nicht, mehr als Unendlich wirds doch nicht?

Schöne deutsche Übersicht: regexp-evaluator.de/tutorial/

_________________
"The phoenix's price isn't inevitable. It's not part of some deep balance built into the universe. It's just the parts of the game where you haven't figured out yet how to cheat."
jfheins
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 864
Erhaltene Danke: 143

Win7
VS 2013, VS2015
BeitragVerfasst: Do 06.06.13 12:29 
user profile iconMartok hat folgendes geschrieben Zum zitierten Posting springen:
Das + dahinter erschließt sich mir grad nicht, mehr als Unendlich wirds doch nicht?

Ähh ja, das ist noch ein klitzekleiner Fehler :angel:

@trm: Deine Erklärung ist leider eher dürftig, da solltest du dich nochmal mit dem Aufbau von RegExen beschäftigen 8)

Damit PHP das Muster von den Optionen unterscheiden kann, wird es in Begrenzer eingefasst. Du kannst dafür vieles hernehmen - ich habe % benutzt, aber &, $, / oder # gehen auch.
Dann kommt eben eine Gruppe die ein word-char enthält. Die Backreference wird mit \\1 geschrieben, weil PHP sonst den Backslash verarbeitet. \\ wird durch PHP also mit einem einzigen \ ersetzt. Die RegEx Engine sieht also nicht \\1 sondern \1. Dahinter wird die Anzahl spezifiziert. (Das geht mit einem +, *, ? in kurz, oder eben mit den {} ausführlich)

Eine weitere Sache fällt mir aber gerade noch auf: Die 4 spezifiziert ja die Anzahl der Backreference. D.h. wenn du 4 Zeichen schon erkennen möchtest, dann hast su einen Match und drei Wiederholungen. Dein regex müsste also sein: (\w)\1{3,}
Bzw. für PHP: '%(\w)\\1{3,}%i'
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 16:25 
Herzlichen Dank :)

@Martok, das schau ich mir mal an.
@jfheis: schön erklärt :)

Schöne Woche, bis bald.

Gruß Mathias

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 16:28 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Herzlichen Dank :)

@Martok, das schau ich mir mal an.
@jfheis: schön erklärt :)

Schöne Woche, bis bald.

Gruß Mathias



Edit:

Hm, ist doch zum Heulen. Wenn ich nun noch Sonderzeichen mit verarbeiten möchte, muss ich die dann nach dem \w mit einfügen?
Z.B.: ein Sternchen ( * ) wäre ja eigentlich so aufzunehmen in die Gruppe: (\w*) oder?
Klappt aber nicht.


Sorry, ich klicke immer auf Bearbeiten mit Zitat. Wollte ich beide male nicht.

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 06.06.13 18:23 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Hm, ist doch zum Heulen. Wenn ich nun noch Sonderzeichen mit verarbeiten möchte, muss ich die dann nach dem \w mit einfügen?

D.h. alle Zeichen, außer Zeilenumbrüche?

ausblenden PHP-Quelltext
1:
preg_replace('%(.)\\1{3,}%i''$1'$zeichenkette);					


Dafür gibt es den Dot ".", siehe auch www.regular-expressi....info/reference.html.
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 19:14 
Dank Marc, das hatte ich auch schon gefunden. Mir ging es darum, einzelne Zeichen einzubinden, also zusätzlich zu \w
Also nicht alles, sondern ausgewählte Zeichen je nach Bedarf.

Gruß Mathias

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 06.06.13 19:20 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Mir ging es darum, einzelne Zeichen einzubinden, also zusätzlich zu \w
Also nicht alles, sondern ausgewählte Zeichen je nach Bedarf.

Das hattest Du nicht geschrieben. :D

Dann probier's mal mit der Mengenschreibweise:
ausblenden PHP-Quelltext
1:
preg_replace('%([av-])\\1{3,}%i''$1'$zeichenkette);					

In diesem Fall werden a v und - berücksichtigt.

Siehe diesmal: www.ag-intra.net/linux-al-regex.html

Edit: Kommata entfernt.


Zuletzt bearbeitet von Marc. am Do 06.06.13 21:34, insgesamt 2-mal bearbeitet
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 19:55 
Hm, also ist es gar nicht möglich in einer Gruppe, eine Syntax wie \w UND ausgesuchte Zeichen zu berücksichtigen?

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)
Marc.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1876
Erhaltene Danke: 129

Win 8.1, Xubuntu 15.10

BeitragVerfasst: Do 06.06.13 20:06 
user profile icontrm hat folgendes geschrieben Zum zitierten Posting springen:
Hm, also ist es gar nicht möglich in einer Gruppe, eine Syntax wie \w UND ausgesuchte Zeichen zu berücksichtigen?

Selbstverständlich. :nixweiss:

Ich hab hier kurz eine Testseite eingerichtet mit folgenden Zeilen:
ausblenden PHP-Quelltext
1:
2:
3:
4:
5:
6:
7:
<?php
$zeichenkette = $_GET['input'];
printf("Eingebene Zeichenkette ist: %s \n"$zeichenkette);

$ausgabe = preg_replace('%([*,\w])\\1{3,}%i''$1'$zeichenkette);
printf("Ausgabe: %s \n"$ausgabe);
?>
trm Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 485
Erhaltene Danke: 19

Windows 7x64
Delphi 7
BeitragVerfasst: Do 06.06.13 20:51 
Hi Marc,

also muss eine individuelle Auflistung der Zeichen vor dem \w stehen.

Das Komma wird aber hier auch als Gruppenzeichen gewertet ( marc-henning.de/exp/...a***,,,,,,,,*----333 ), da es nicht maskiert ist, korrekt?

Vielen Dank, meine Fragen sind somit gelöst :)

_________________
In Erfurt gibt es eine Pension, in der es gemütlich ist, Google einfach nach Pension Fiege ;)