Zeichen elimenieren - POS Drucker druckt nicht
ralphi
- php
Hi Leute,
ich möchte alle Zeichen, die ein POS-Drucker im Standard-Modus mit Standard-Zeichensatz nicht drucken kann, umwandeln in Leerzeichen oder ausblenden.
Der Inhalt kommt von einem Textfeld, was ich nicht prüfen kann.
Auf den Drucker hab ich keinen Zugriff mehr – Testen kann ich auch nix.
Lediglich die Webseite mit dem Textfeld kann ich noch ändern.
Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?
Hallo ralphi,
Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?
$text = preg_replace('\w',' ', $text);
Welche Zeichen der Drucker drucken kann, weiß ich nicht. \w
sind alle lateinischen Buchstaben und arabische Ziffern, das ist also zu wenig. Und ob das gefahrlos ist, möchte ich auch nicht einschätzen.
Bis demnächst
Matthias
Hi,
Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?
$text = preg_replace('\w',' ', $text);
Welche Zeichen der Drucker drucken kann, weiß ich nicht.
ich auch nicht; ich wäre mal davon ausgegangen, alles was ASCII ist, dürfte okay sein. Aber da ist ralphi tatsächlich zu geizig mit Info.
\w
sind alle lateinischen Buchstaben und arabische Ziffern, das ist also zu wenig.
Du willst also alle Buchstaben und Ziffern aus dem ASCII-Bereich durch Leerzeichen ersetzen?
Teufel nochmal, wie war das noch mit der Negation ...
So long,
Martin
Hallo Der Martin,
Du willst also alle Buchstaben und Ziffern aus dem ASCII-Bereich durch Leerzeichen ersetzen?
Teufel nochmal, wie war das noch mit der Negation ...
Aah ;-) \W
ist die Negation von \w
.
Bis demnächst
Matthias
Hi,
Nun
Der Drucker hängt noch an einem Kassensystem am Parallelport. Das druckt im page-mode.
Ich drucke über LAN und schalte den Drucker in den Standart-Mod.
$command = "\e\x40"; // ESC @ - init
if( ! socket_send ( $sock , $command , strlen($command) , 0)) { $status = 1;}else{ $status = 0;}
$command = "\e\x53"; // ESC S - standart mode
if( ! socket_send ( $sock , $command , strlen($command) , 0)) { $status = 1;}else{ $status = 0;}
Der Drucker erhält den Job ohne Fehlermeldung über socket.
95% werden gedruckt – 5% nicht.
Meine Schlussfolgerung ist, dass irgend ein Zeichen dabei ist, was er nicht mag. Mein Problem ist, das ich die Jobs, die er nicht druckt nicht kenne :-(
Die Umlaute hab ich schon konvertiert.
Nun er druckt alle Buchstaben (außer Umlaute) und Zahlen – logo,
*, :, =, ?,! und noch ein paar auch.
Jetzt kann ich nur raten, ob es ein gängiges Zeichen ist: ; oder “, oder ob es was ungewöhnliches ist wie | oder ^.
Hallo ralphi,
Nun er druckt alle Buchstaben (außer Umlaute) und Zahlen – logo,
*, :, =, ?,! und noch ein paar auch.
Welche brauchst du denn?
$text = preg_replace('[^A-Za-z0-9]',' ', $text);
Nach der neun zählst du noch all die auf, die du haben möchtest. Zeichen, die bei regulären Ausdrücken eine Sonderbedeutung haben, musst du mit einem Backslash maskieren. Ob das der Fall ist, sieht man -so man es nicht weiß- am besten auf https://regex101.com/
Bis demnächst
Matthias
Hi,
das mit preg_replace ist ein toller Tipp von Euch :-)
Ich muss gestehen, dass ich mit dem REGEXP so meine Schwierigkeiten habe.
Wie würde es den aussehen, wenn ich zu [^A-Za-z0-9] noch zB. ":, &, !" zulassen möchte?
Hallo ralphi,
das mit preg_replace ist ein toller Tipp von Euch :-)
Das muss gar nicht soo toll sein.
Ich muss gestehen, dass ich mit dem REGEXP so meine Schwierigkeiten habe.
Wie würde es den aussehen, wenn ich zu [^A-Za-z0-9] noch zB. ":, &, !" zulassen möchte?
[]
definiert im Wesentlichen eine Menge erlaubter Zeichen[^]
ist die Negation dieser Zeichen[^A-Za-z0-9]
sind dann alle Zeichen außer lateinische Buchstaben und arabische Ziffern[^A-Za-z0-9:&!]
Bis demnächst
Matthias
Moin!
POS-Drucker im Standard-Modus mit Standard-Zeichensatz
Gibt es einen einfachen Befehl in php, der so was gefahrlos wandelt?
Definitiv die Standardvorgehensweise:
$firstDoThis = thinkAbout(getManual(getPrinterModel()));
anders (in Javascript) ausgedrückt:
firstDoThis = function() {
return thinkAbout(getManual(getPrinterModel()));
}
Ergänzt:
$infos['manual'] = getManual(getPrinterModel());
if (! infos['manual']) {
$infos['secondChance'] = doWebSearch(getPrinterModel());
}
$firstDoThis = thinkAbout($infos);
Für getPrinterModel()
gibt es aber keinen Ersatz.
Jörg Reinholz
Hi,
Ist ein Bixolon F310
Wie alle Pos-Drucker unterstützt der auch die Grund-Kommandos von EPSON ESC/P und die gängigen Sprach-Zeichentabellen sind auch gleich.
Moin!
Wie alle Pos-Drucker unterstützt der auch die Grund-Kommandos von EPSON ESC/P und die gängigen Sprach-Zeichentabellen sind auch gleich.
Na dann:
function ascii_filter($str, $replacement='') {
return preg_replace('/[[:^print:]\r\n]/', $replacement, $str); //
}
Lässt nur die druckbaren ASCII-Zeichen durch, zusätzlich Zeilenumbruch (\n) und Wagenrücklauf (\r).
Willst Du ausgefilterte Zeichen ersetzen, dann Aufruf mit:
ascii_filter( 'Was für ein Ärger!' , '_' );
Allerdings frage ich mich, ob es nicht besser wäre, den korrekten Treiber zu installieren. Oder ist das schon geschehen?
Jörg Reinholz
Hi,
klasse – Vereinfachungen, machen den Einstieg in RegEx etwas leichter :-)
Da ich nicht weiß, welches Zeichen das drucken blockiert, versuch ich's mal mit:
$zeile = ereg_replace("[[:cntrl:]]"," ",$zeile);
$zeile = ereg_replace("[[^:print:]]"," ",$zeile);
// The [[:alnum:]] character class represents alphabetic and numeric characters, and it is same as using [a-zA-Z0-9] in regular expression.
// The [[:blank:]] represents horizontal space, tab-space characters in regular expression.
// The [[:cntrl:]] character class matches characters form feed, backspace, tabspace character etc. All these characters have ASCII value less than 31.
// [[:punct:]] This character class identifies all the punctuation characters.
// [[:space:]] This character class identifies all space characters like "f" -form feed, "n"- newline, "r"- carriage return, "t" - tab, "v" -vertical tab.
// [[:xdigit:]] This character class helps in finding hexadecimal digit character.
Mal kucken, ob's jetzt alles druckt (Umlaute natürlich vorweg eleminiert)
Moin!
Mal kucken, ob's jetzt alles druckt (Umlaute natürlich vorweg eleminiert)
Tu das nicht!
<?php
$str="SØR\r\nsœur\r\nSörewald";
echo ereg_replace("[[^:print:]]"," ",$str), "\n";
Ergebnis:
$ php Test_oe
PHP Deprecated: Function ereg_replace() is deprecated in /tmp/Test_oe on line 3
Deprecated: Function ereg_replace() is deprecated in /tmp/Test_oe on line 3
SØR
sœur
Sörewald
Jörg Reinholz
Hi Jörg,
danke für den Hinweis.
Allerdings mit:
echo preg_replace("[[:^print:]]"," ",$x)."\n";
zieht er mir zu viel Zeichen raus.
Ich weiß, dass er zB. email-Adressen mit @ und Punkt druckt.
Ich werde demnächst mal bei meinem Kunden vorbeifahren und die ASCII- Tabelle durchlaufen lassen.
Erst dann weiß ich was für ein Zeichen rumärgert :-(
Moin!
echo preg_replace("[[:^print:]]"," ",$x)."\n";
zieht er mir zu viel Zeichen raus.
Ich weiß, dass er zB. email-Adressen mit @ und Punkt druckt.
Hä? Wenn Du die Syntax frei verballhornst, dann wundere Dich nicht über falsche Ergebnisse!
<?php
$haystack = "Ödipuß<foo@example.com>\r\n";
$search = '/[^[:print:]ÖöÄäÜüß]\r\n/';
echo preg_replace($search, '_', $haystack);
echo "Ende\n";
Ergebnis:
fastix@trainer:/tmp$ php test_replace.php
Ödipuß<foo@example.com>
Ende
fastix@trainer:/tmp$
Versuch 2:
<?php
$haystack = "Ödipuß<foo@example.com>\r\n";
$search = '/[^[:print:]ÖöÜüÄäß\n\r]/';
echo preg_replace($search, '_', $haystack);
echo "Ende\n";
Ergebnis:
fastix@trainer:/tmp$ php test_replace.php
Ödipuß<foo@example.com>
Ende
fastix@trainer:/tmp$
Versuch 3:
<?php
$haystack = "Ödipuß<foo@example.com>\r\n";
$search = '/[^[:print:]ÖöÜüÄäß\n\r]/';
echo preg_replace($search, '_', $haystack);
echo "Ende\n";
Ergebnis:
php test_replace.php
__dipu__<foo@example.com>
Ende
fastix@trainer:/tmp$
Es geht also sehr wohl.
BTW: Kann es sein, dass dem Drucker "Seiten" geliefert werden, bei denen der druckbare Bereich überschritten wird? Grund für die Annahme: Im Handbuch laß ich was von wegen mitgelieferte Schriftart benutzen.
Jörg Reinholz
Moin!
BTW: Kann es sein, dass dem Drucker "Seiten" geliefert werden, bei denen der druckbare Bereich überschritten wird? Grund für die Annahme: Im Handbuch laß ich was von wegen mitgelieferte Schriftart benutzen.
Versuch 3 nochmal, beim Copy und Paste was vertan:
<?php
$haystack = "Ödipuß<foo@example.com>\r\n";
$search = '/[^[:print:]\n\r]/';
echo preg_replace($search, '_', $haystack);
echo "Ende\n";
Ergebnis:
fastix@trainer:/tmp$ php test_replace.php
__dipu__<foo@example.com>
Ende
fastix@trainer:/tmp$
Jörg Reinholz
Hi,
ich probier mal:
$search = '/[^[:print:]]/';
Den Zeilenumbruch setz ich in der Formatierung drumrum. In den Daten vom Eingabe-Textfeld brauch ich den nicht.
Was bedeutet eigentlich der Slash am Anfang und Ende?
Viele Grüße aus LA
ralphi
Moin!
Was bedeutet eigentlich der Slash am Anfang und Ende?
Dass sind die Zeichen, die den regulären Ausdruck einleiten und beenden. Per Definition kann es jedes beliebige Zeichen sein aber:
Jörg Reinholz