Einzelnen Beitrag anzeigen
  #3 (permalink)  
Alt 26-04-2018, 18:30
Benutzerbild von fireweasel fireweasel
 Registrierter Benutzer
Links : Onlinestatus : fireweasel ist offline
Registriert seit: Sep 2008
Ort: At home
Beiträge: 851
fireweasel wird schon bald berühmt werdenfireweasel wird schon bald berühmt werden
fireweasel eine Nachricht über AIM schicken fireweasel eine Nachricht über Yahoo! schicken
Standard

Zitat:
Zitat von fineleric Beitrag anzeigen
Ich möchte verschiedene Strings die eine Zahl und ein Währungsymbol säubern und auslesen.
Hier ein Versuch:
PHP-Code:
function extractCurrencyAmounts(
    
$text/// utf-8-encoded string 
    
$currencies '[$€]' // PCRE subpattern w/o parentheses 
) {
    if (!
is_int(@preg_match('/' $currencies '/'''$h))) {
        throw new 
InvalidArgumentException(sprintf('given argument "%s" is not a valid PCRE subpattern'$currencies));
    }
    if (
preg_match('/(\x5c\x5c)*\((?!\?[:!=])/'$currencies)) {
        throw new 
InvalidArgumentException(sprintf('given argument may only contain anonymous subpatterns'));
    }
    return 
preg_match_all(
        
'/(?:(' $currencies ')\s*)?([-+]?[0-9]*)[,.]([0-9]+|[\-\x{2010}-\x{2015}]{1,2})(?:\s*(' $currencies '))?/u'
        
$text,
        
$h,
        
PREG_SET_ORDER
    

        ? 
array_map(
            function (
$hSet) {
                
// -, -- und co. durch Ziffern ersetzen (vereinheitlichen)
                
if (!is_numeric($hSet[3])) {
                    
$hSet[3] = '00';
                }
                
// steht die Waehrung nach dem Betrag,
                // schieben wir sie nach vorn
                
if (isset ($hSet[4])) {
                    
array_splice($hSet11array_pop($hSet));
                }
                return 
$hSet;
            }, 
            
$h
        
)
        : 
null;            
}; 
Ein einfacher Test:
PHP-Code:
var_dump(extractCurrencyAmounts(
    
'DEM 7,-- ... 3.45 €, $ 3,45, €3.45 usw.',
    
'$|€|DEM|EUR|USD'
)); 
... und so etwas ähnliches sollte herauskommen:
Code:
array(4) {
  [0] => array(4) {
    [0] => string(4) "7,--"
    [1] => string(0) ""
    [2] => string(1) "7"
    [3] => string(2) "00"
  }
  [1] => array(4) {
    [0] => string(8) "3.45 €"
    [1] => string(3) "€"
    [2] => string(1) "3"
    [3] => string(2) "45"
  }
  [2] => array(4) {
    [0] => string(6) "$ 3,45"
    [1] => string(1) "$"
    [2] => string(1) "3"
    [3] => string(2) "45"
  }
  [3] => array(4) {
    [0] => string(7) "€3.45"
    [1] => string(3) "€"
    [2] => string(1) "3"
    [3] => string(2) "45"
  }
}
Das reicht für deine Beispielangaben und noch ein wenig mehr. Falls die Euro-Angaben bei dir verschluckt werden, musst du den zu durchsuchenden Text mit utf8_encode() oder mb_convert_encoding() vorbereiten.

Zitat:
Zitat von fineleric Beitrag anzeigen
Hallo!
Also Komma und Punkt sollten möglich sein, weiterhin auch verschiedene Währungssymbole.
Komma und Punkt als Trennzeichen stellen die geringste Hürde dar. Schwieriger wird es, alle Notationsarten von Zahlenkolonnen genau zu erfassen. Deswegen habe ich mich auf Ziffern beschränkt.

Währungssymbole gibt es sehr viele. Sie können auch aus mehreren Zeichen bestehen (wie oben mit DEM|EUR|USD angedeutet).

Falls vor und nach dem Betrag ein Währungssymbol erkannt wird, überschreibt die Funktion einfach das vordere mit dem hinteren. Hier wäre eventuell eine andere Fehlerbehandlung sinnvoll.

Geändert von fireweasel (26-04-2018 um 18:34 Uhr) Grund: Ergänzungen
Mit Zitat antworten