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.
fonte
2011-09-10 14:42:12
perché 'preg_quote' le sfugge se non hanno bisogno di fuggire? qual è il trucco? – Pacerier
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. –
c'è anche 1 situazione in cui non sfuggire a quelli può fallire qualcosa? o è sicuro assumere che non fallirà al 100%. – Pacerier