[ACCEPTED]-Regex to only allow alphanumeric, comma, hyphen, underscore and semicolon-preg-replace
It's not the comma and semicolon causing 11 your problem; it's the hyphen. Look at the 10 parts of your character class and consider 9 what they mean:
0-9 # Anything from '0' to '9', meaning 0, 1, 2, ... 9
A-Z # Anything from 'A' to 'Z', meaning A, B, C, ... Z
_-, # Anything from '_' to ',', meaning...uh...hmmm.
There's no clear progression 8 from _
to ,
, so the regex engine isn't sure 7 what to make of this. In character classes, if 6 you want a hyphen to be interpreted literally, it 5 needs to be at the very beginning or end 4 of the class (or escaped with a backslash). So 3 any of these will work:
[^,;a-zA-Z0-9_-]
[^-,;a-zA-Z0-9_]
[^a-zA-Z0-9_\-,;]
As for trimming off 2 the end, you can do all of this in one regex 1 replace:
$data = preg_replace('/[^,;a-zA-Z0-9_-]|[,;]$/s', '', $data);
I believe it's the placement of the hyphen 3 that matters -- has to be at start or end 2 to be a hyphen (literal), otherwise it's 1 being used to define a range.
You can escape the hyphen and put it anywhere 4 in the regex like this \-
As for the trailing 3 semicolons and commas, try this /[,;]+$/
it should 2 match any commas and semicolons at the end 1 even if they are many.
More Related questions
We use cookies to improve the performance of the site. By staying on our site, you agree to the terms of use of cookies.