add

Showing posts with label Regular Expressions. Show all posts
Showing posts with label Regular Expressions. Show all posts

Friday, May 17, 2013

Regex in PHP

1. 1 Character 1 number and string length
^\S*(?=\S{8,})(?=\S*[a-z])(?=\S*[A-Z])(?=\S*[\d])\S*$

  • ^: anchored to beginning of string
  • \S*: any set of characters
  • (?=\S{8,}): of at least length 8
  • (?=\S*[a-z]): containing at least one lowercase letter
  • (?=\S*[A-Z]): and at least one uppercase letter
  • (?=\S*[\d]): and at least one number
  • $: anchored to the end of the string
To include special characters, just add (?=\S*[\W]), which is non-word characters

OR

(?=^.{8,}$)((?=.*\d)|(?=.*\W+))(?![.\n])(?=.*[A-Z])(?=.*[a-z]).*$
   * contain at least (1) upper case letter
   * contain at least (1) lower case letter
   * contain at least (1) number or special character
   * contain at least (8) characters in length



References
1. http://www.autohotkey.com/docs/misc/RegEx-QuickRef.htm
2. http://www.regular-expressions.info/index.html

Thursday, November 17, 2011

Force a PDF to download

I recently needed to force a PDF to download using Apache. The default behaviour for most browsers is to try to open the PDF inside the browser itself. This is fine for a small PDF or for powerful machines - but a large PDF on even a modest machine can often lock the browser up. This needed fixing!

Little R&D of the Apache documents, you can get FilesMatch option which takes Regular Expressions. Initially I used something like this...
<files *.pdf=""></files><br />
<files *.pdf=""> ForceType application/pdf</files><br />
<files *.pdf=""> Header set Content-Disposition attachment</files><br />
This worked PERFECTLY - except some files had upper-case extensions and some had lower and I could see situations in the future where combinations of upper and lower case would be used too - just to piss me off! Because of this, not even this would work...

<filesmatch \.(pdf|pdf)=""></filesmatch>
<filesmatch \.(pdf|pdf)=""> ForceType application/pdf</filesmatch><filesmatch \.(pdf|pdf)=""> Header set Content-Disposition attachment</filesmatch>
That would match perfectly - as long as it was an EXACT match on upper OR lower case.
I was reaching the end of my patience - that is until I read the Using Character Classes on PerlDoc.
This showed me that I could force the RegEx (short for Regular Expressions) to match in a case-insensitive manner. This lead me to the following...
<filesmatch \.(?i:pdf)$=""></filesmatch>
<filesmatch \.(?i:pdf)$=""> ForceType application/pdf</filesmatch><filesmatch \.(?i:pdf)$=""> Header set Content-Disposition attachment</filesmatch>
However this only worked in proper browsers - and the bulk of the world are sadistic enough  to use Internet Explorer based ones. For some reason, if Internet Explorer see's the content type "Application/PDF" it will simply open it up in the reader. The solution? Why not pretend its a bog standard Octet Stream, just like a Zip file? After all, that's basically all it is; a binary file... A steam of bytes.
<FilesMatch "\.(?i:pdf)$">
ForceType application/octet-stream
Header set Content-Disposition attachment
FilesMatch>
And there you have it… A perfectly working modification to force all PDF files to download - this will work for any file extensions you chose to put into the FilesMatch argument!

Impotant Note :
You can put this code in either the htaccess or the vhost configuration for your server.
You can read more about FilesMatch at the Apache Document page.