2012-03-30 4 views
6

Mi sono solo bloccato e non riesco a trovare una soluzione. Vorrei provare a trasformare una stringa in minuscolo usando preg_replace. Non riesco proprio a creare la regex corretta. Il motivo è che il normale strtolower non supporta i caratteri Unicode. So che potrei usare mb_strtolower ma questa funzione sembra essere piuttosto lenta e accanto a loro non tutti hanno il supporto MB.Come trasformare una stringa in minuscolo con preg_replace

Qualsiasi indizio?

saluti, Radek

EDIT: Ok, grazie molto per il vostro aiuto ragazzi. Penso che il mio approccio non fosse del tutto corretto. Penso che sarebbe molto meglio usare questo: How do I detect non-ASCII characters in a string? e poi usare rispettivamente strtolower o mb_strtolower se disponibili.

+8

Sono curioso, quello che si fa pensi che un'espressione regolare sarebbe più veloce di mb_strtolower? –

+0

è possibile utilizzare la funzione php strtolower() per convertire la puntura in minuscolo. –

+0

@andreas Non sono sicuro. Fondamentalmente volevo testarlo per primo. –

risposta

5

Regex non è in grado di modificare i caratteri da solo, può solo modificare il loro ordine e/o aggiungere caratteri aggiuntivi/eliminarne alcuni.

C'è il flag preg_replace_callback o /e, ma possono manipolare solo con funzioni note e, pertanto, non possono fare meglio di strtolower.

Se non si può fare affidamento su existense della funzione mb_strolower, è necessario implementarlo da soli.

+0

Quindi in fondo non è possibile? –

+0

Sì, in pratica non è possibile. Regex è uno strumento per la corrispondenza dei pattern e la ricomposizione delle stringhe, non può trasformare i caratteri da solo. – Nameless

0

Non si dovrebbe utilizzare un preg_replace per questo perché preg_replace viene utilizzato per abbinare un determinato pattern e sostituirlo con qualcos'altro. Il Wat che vuoi è sostituire ogni singolo carattere maiuscolo con uno minuscolo, quindi non è necessario abbinare un motivo.

mb_strtolower sarebbe la strada da percorrere, e se non si hanno le funzioni mb_ dovrete scrivere una funzione da soli, usando un sacco di str_replace di ...

+0

Sì, ma mb_stratolower è così dannatamente lento. Ho fatto alcuni test per confrontare mb_strlower e nativo strtolower e MB sembra essere circa 30 volte più lento di quello nativo. Il mio più grande problema è che al momento devo fare lo strtolower non so se ho caratteri unicode all'interno della stringa o meno. –

+0

Forse prima usare strtolower, quindi utilizzare preg_replace_callback per sostituire tutti i caratteri che non sono caratteri minuscoli predefiniti (/ [^ az] + /) e quindi usare mb_strtolower per quello – rednaw

+1

Sono venuto qui perché stavo cercando un modo per "decodificare" un stringa (ad esempio, gira "' La guerra di NextGen' "a" 'the war of nextGen'" - quindi per questo caso il lower-case non funziona per me. Stavo cercando di usare preg_replace con '"/\ b (\ w)/"' e la stringa di sostituzione come 'strtolower (" $ 1 ")' - ma non funziona! Sicuramente dovrebbe esserci un modo? –