Let's do some "deciph4r4ng"
Java 7, 81 80 bytes
void a(char[]a){for(int i=0;++i<a.length;)if(a[i]>47&a[i]<58)a[i]=a[i-a[i]+47];}
Try it online!
Saved 1 byte thanks to Anders Tornblad. The first character cannot be a digit so it doesn't need to be checked meaning we can preincrement before checking our terminate condition.
Haskell, 55 bytes
o#c|c>'/',c<':'=o!!read[c]:o|1<2=c:o
reverse.foldl(#)[]
Usage example: reverse.foldl(#)[] $ "Prog2am0in6 Puz0les7&1Cod74G4lf"
-> "Programming Puzzles & Code Golf"
. Try it online!
Reduce the string to a reverse copy of itself with the numbers replaced by the corresponding chars. "reverse", because this way we have easy access to the string so far when indexing the numbers. Reverse it again.
C, 46 bytes
f(char*s){for(;*s++;)*s=s[(*s-52)/6?0:47-*s];}
Try it online!
C, 52 49 48 bytes
Thanks to @l4m2 for saving a byte!
f(char*s){for(;*s++;)*s>47&*s<58?*s=s[47-*s]:0;}
Edits the input string directly.
Try it online!
Alternative 50-byte version:
f(char*s){for(;*s++;)*s=abs(*s-57)>9?*s:s[47-*s];}
Recursive version, 48 bytes:
f(char*s){*s>47&*s<58?*s=s[47-*s]:0;*s++&&f(s);}