Rimuovi tutto da una string a parte un numero e un denominatore di valuta

Ho le seguenti stringhe di esempio:

The price is $54.00 including delivery On sale for £12.99 until December European pricing €54.76 excluding UK 

Da ognuno di loro voglio restituire solo il prezzo e il denominatore di valuta

 $54.00 £12.99 €54.76 

Il mio process è l'avere una serie di simboli di valuta e cercare la string per ciascuno e quindi catturare solo i caratteri prima dello spazio dopo quello – tuttavia, $ 67,00 fallirebbero

Quindi, posso eseguire una serie di simboli di valuta preimpostati, quindi esplodere la string e tritarla alla successiva istanza di un carattere non numbersco che non è un. o, – o forse con regex

È ansible?

In espressioni regolari, \p{Currency_Symbol} o \p{Sc} rappresentano un simbolo di valuta.

Tuttavia, PHP support solo la forma abbreviata \p{Sc} e il modificatore /u è richiesto.


Usando il model regex

 /\p{Sc}\s*\d[.,\d]*(?<=\d)/u 

sarai in grado di abbinare per esempio:

  • $ 1.234
  • £ 12.3
  • € 5.345,01

Se vuoi usarlo . come separatore decimale e , come un delimitatore di migliaia, poi andare con

 /\p{Sc}\s*\d{1,3}(?:,\d{3})*(?:\.\d+)?/u 

Controlla questa demo .

Potresti fare qualcosa del genere:

 preg_match('/(?:\$|€|£)\s*[\d,.-]+/', $input, $match); 

E poi trova la valuta e il prezzo all'interno di $match .

Naturalmente, è ansible generare quella prima parte da una serie di simboli di valuta. Basta non dimenticare di scappare tutto:

 $escapedCurrency = arrays_map("preg_quote", $currencyArray); $pattern = '/(?:' . implode("|", $escapedCurrency) . ')\s*[\d,.-]+/'; preg_match($pattern, $input, $match); 

Alcuni possibili miglioramenti alla fine del pattern (il numero effettivo):

 (?:\$|€|£)\s*\d+(?:[.,](?:-|\d+))? 

Ciò assicurerà che ce ne sia solo uno . oppure , seguito da o - o solo cifre (nel caso in cui l'intenzione fosse di consentire un separatore decimale internazionale).

Se si desidera solo consentire alla virgola di separare migliaia, si potrebbe fare questo:

 (?:\$|€|£)\s*\d{1,3}(?:,\d{3})*(?:\.(?:-|\d+))? 

Questo corrisponderà al più lungo numero "corretto" formattato (cioè $ 1,234.4567,123.456 -> $ 1,234.4567 o € 123,456789.12 -> € 123,456 ). Dipende davvero da quanto preciso vuoi andare.