2010-03-01 11 views

risposta

27

[e] sono caratteri speciali in un'espressione regolare. Sono usati per elencare i personaggi di una partita. [a-z] corrisponde a qualsiasi lettera minuscola tra "a" e "z". [03b] corrisponde a "0", "3" o "b". Per abbinare i caratteri "[" e "]", devi sfuggire a loro con uno \ precedente.

Attualmente il tuo codice dice "sostituire qualsiasi carattere di [](). con una stringa vuota" (riordinato dall'ordine in cui sono stati digitati per maggiore chiarezza).


partita Greedy:

preg_replace('/\[.*\]/', '', $str); // Replace from one [ to the last ] 

Una partita avido potrebbe corrispondere più [s] e s. Questa espressione richiederebbe an example [of "sneaky"] text [with more "sneaky"] here e trasformarla in an example here.


Perl ha una sintassi per una partita non avido (molto probabilmente non si vuole essere avidi):

partite
preg_replace('/\[.*?\]/', '', $str); 

non avidi cercano di catturare il minor numero di caratteri possibile. Utilizzando lo stesso esempio: an example [of "sneaky"] text [with more "sneaky"] here diventa an example text here.


solo fino al primo segue]:

preg_replace('/\[[^\]]*\]/', '', $str); // Find a [, look for non-] characters, and then a ] 

Questo è più esplicito, ma più difficile da leggere. Usando lo stesso testo di esempio, otterresti l'output dell'espressione non-golosa.


Nota che nessuno di questi si occupa esplicitamente dello spazio bianco. Gli spazi su entrambi i lati di [e] rimarranno.

Si noti inoltre che tutti questi errori possono avere un input non valido. Più [s] e s senza corrispondenze potrebbero causare un risultato sorprendente.

+0

Mille grazie per la spiegazione! –

+0

Hmm, l'input non valido è qualcosa in cui posso incorrere. È possibile gestire l'istanza di non avere un abbinamento]? –

+0

Dovrei sapere come lo vuoi gestire. Cosa speri che faccia con input malformati? –

1

Penso che si vuole realmente parentesi per i vostri supporti esterni dal momento che è un gruppo. le parentesi quadre sono una gamma di espressioni. Non sei sicuro di come inserirlo in SO.

/(\\[.*\\])/ 
6

Solo nel caso in cui si sono alla ricerca di una rimozione ricorsiva:

$str = preg_replace("/\[([^\[\]]++|(?R))*+\]/", "", $str); 

che permette di convertire questo:

Questo [Testo [altro testo]] è fresco

a this:

Th è bello

Problemi correlati