2011-09-10 12 views
10

http://php.net/manual/en/function.preg-quote.php:Perché abbiamo bisogno di sfuggire al! < >: = - nelle espressioni regolari php?

I caratteri speciali per le espressioni regolari sono:. \ + *? [^] $() { } =! <> | : -

Tuttavia this page dice che i caratteri speciali sono [ \^$ . | ? * + ()

Ok So che la prima pagina è specificamente sulle espressioni regolari PHP. Tuttavia, perché è necessario sfuggire allo !, <, >, :, =, -?

ho cercato di fare un preg_match senza sfuggire <, >, - e ! e tutto è perfettamente funzionante.

risposta

5

Questi caratteri sono metacaratteri, ma non hanno bisogno di scappare. Quello che hanno in comune è che si verificano in costrutti speciali di raggruppamento:

(?:...)  # non-capturing group 
(?=...)  # positive lookahead 
(?!...)  # negative lookahead 
(?<name>...) # named capturing groups 
(?<=...)  # positive lookbehind 
(?<!...)  # negative lookbehind 
(?>...)  # atomic group 

Ma hanno solo un significato speciale in questo contesto. Quindi, se prendi una stringa e sfuggi a tutti questi caratteri: [\^$.|?*+(){, ottieni un'espressione regolare che corrisponderà esattamente alla stringa carattere per carattere, perché quegli altri metacaratteri non possono mai trovarsi in un meta-contesto.

Ad esempio, lo ] è solo un metacarattere se c'era una precedente [ senza caratteri di escape che ha aperto una classe di caratteri.

Analogamente, il - è solo una metacarattere in una classe di caratteri, che significa "range" come in [a-z] (o un letterale - come in [abc-].

Quindi per evitare la stringa [tag-soup] è sufficiente uscire dallo [. Al di fuori di una classe di caratteri, ] e - vengono semplicemente trattati come valori letterali.

In sintesi, se si prende una stringa e si sfuggono tutti i metacaratteri "incondizionati" ([\^$.|?*+(){), si ottiene un'espressione regolare che corrisponde esattamente alla stringa carattere per carattere.

+0

perché 'preg_quote' le sfugge se non hanno bisogno di fuggire? qual è il trucco? – Pacerier

+0

Mi sembra un po 'troppo zelante. Se la stringa di input è '(? :)', quindi '\ (\?: \)' Sarebbe la versione corretta di escape. '\ (\? \: \)' probabilmente non farà male dato che in molte espressioni regex le sequenze di escape sconosciute vengono semplicemente ignorate, ma alcune causano errori su di esse, quindi di solito è una buona idea non scappare più del necessario. –

+0

c'è anche 1 situazione in cui non sfuggire a quelli può fallire qualcosa? o è sicuro assumere che non fallirà al 100%. – Pacerier

4

La pagina a cui ci si collega è intitolata "sintassi di base per l'espressione regolare". C'è un collegamento a una pagina dal titolo "advanced regex syntax". Qui vengono utilizzati tutti i caratteri extra specificati.

  • ! viene utilizzato per lookaheads negativi e lookbehinds
  • < viene utilizzato per lookbehinds
  • > è utilizzata per i gruppi atomici
  • : servono ad impostare flag per solo una parte di una regex
  • = è utilizzato per lookaheads positivi e lookbehinds
  • - viene utilizzato per carattere r anges and adjusting flags
+0

ma perché abbiamo bisogno di sfuggire a loro? perché 'preg_quote' le sfugge? Anche se non li ho sfuggiti, tutto funziona perfettamente. – Pacerier

+0

@Pacerier Perché potresti inserire solo parte di un'espressione regolare. Le circostanze in cui sarebbe un problema sono piuttosto oscure, ma non inconcepibili. – lonesomeday

+0

potresti dare un esempio (possibilmente in questione edit thx) come non fuggire a! o < or > sta per fallire? perché sì è inconcepibile per me adesso. – Pacerier

1

Questi caratteri sono utilizzati nelle espressioni negative/positive look-behind/ahead/around. Ad esempio:

/^foo(?<!z)bar$/ 

Vedere here per ulteriori informazioni.

3

Un trattino è un carattere speciale all'interno classi di personaggi:

[a-zA-Z0-9] 

Gli altri hanno un significato all'interno di gruppi di confronto, ad esempio, per lookahead/lookbehind:

(?<=foo) 
(?!bar) 

Sono d'accordo con te che nessuno dei questi devono essere sfuggiti. Una volta sfuggite le parentesi e le parentesi quadre, questi altri personaggi perdono il loro significato speciale.

+0

perché 'preg_quote' le sfugge se non hanno bisogno di fuggire? qual è il trucco? – Pacerier

+0

Non c'è cattura. Quei personaggi non hanno bisogno di essere sfuggiti. Chiunque abbia scritto quel metodo era semplicemente troppo entusiasta. –

1

Molti caratteri sono speciali solo in un determinato contesto. Da quelli di base, alcuni esempi:

/-/  # dash 
/[a-z]/ # range 
/[-a-z]/ # a-z or dash 

/[^]/  # literal 
/^/  # meta-character 

/!/  # literal 
/(?!...)/ # meta-character 
Problemi correlati