Search code examples
phpregexpreg-match

preg_match (single quot) isn't working


I don't know why this code isn't working with me , I searched a lot but I couldn't find a solution I just need preg_match to accepts letters, single quot and space. Here is my code:

if (!preg_match("/^[a-zA-Z\-\' ]*$/",$firstName)) {
  $errors[] = "Invalid Name!"; 
}

for example if $firstName = "abc'def" this dosen't work! thanks in advance.

NOTE:

There is htmlspecialchars before the regex check in the code.


Solution

  • The culprit is the htmlspecialchars that converts

    ' to ' (for ENT_HTML401) or ' (for ENT_XML1, ENT_XHTML or ENT_HTML5), but only when ENT_QUOTES is set.

    Solutions:

    • Move the regex check before the htmlspecialchars conversion.

    • Use an inefficient /^(?:[a-zA-Z' -]|&(?:apos|#039);)*$/ pattern where the single quoted entities are included

    • Decode the entities back (with htmlspecialchars_decode($firstName,ENT_QUOTES) or html_entity_decode($firstName, ENT_QUOTES)) and use your /^(?:[a-zA-Z' -]*$/ regex on the "plain" value.