2014-10-20 7 views
7

Sto cercando di togliere tutti i caratteri di una stringa da una stringa eccetto:Le espressioni regolari per una serie di punti unicode PHP

  • caratteri alfanumerici
  • segno del dollaro ($)
  • sottolineatura (_)
  • caratteri Unicode tra i punti di codice U+0080 e U+FFFF

ho le prime tre condizioni per fare questo:

preg_replace('/[^a-zA-Z\d$_]+/', '', $foo); 

Come posso fare sulla corrispondenza della quarta condizione? I looked at using \X ma ci deve essere un modo migliore di elencare oltre 65000 caratteri.

risposta

15

È possibile utilizzare:

$foo = preg_replace('/[^\w$\x{0080}-\x{FFFF}]+/u', '', $foo); 
  • \w - è equivalente di [a-zA-Z0-9_]
  • \x{0080}-\x{FFFF} per abbinare caratteri tra i punti di codice U + FFFF`
  • /u per il supporto unicode in regex
+0

Sì un po 'di exa Ip renderebbe più chiaro da OP Credo che – anubhava

+1

Inizialmente ho esitato a '\ w' perché non ero sicuro se la corrispondenza specifica della locale avrebbe influenzato le cose ma sembra che la gamma Unicode copre comunque i caratteri accentati quindi suppongo sia sicuro . Il '/ u' è quello che sto cercando, grazie. Una nota a margine, cos'è un surrogato solitario? –

+1

@ rink.attendant.6: C'è un intervallo da 'd800' a' dfff' per specificare i surrogati in UTF-16 per consentire di specificare più caratteri. Un singolo surrogato non è un carattere valido in UTF-16 (una coppia è necessaria per specificare un carattere valido). Non riesco a ricordare bene se PCRE genera un errore se incontra un surrogato solitario nella stringa, però. – nhahtdh