Thanks for the suggestion. I replaced the str_replace line with your preg_replace line. Unfortunately, that yields the same result.
In other scripts, I've been able to handle the single quote successfully because I use these before writing it to the database. On redisplay, it is handled fine.
$firstNameClean = str_replace("'", "'", $firstNameClean);
$firstNameClean = mysqli_real_escape_string($cxn, $firstNameClean);
In this case, however, I'm not writing to the database and then reading it again for display in a form. Instead, I'm just reading the input field through trim($_POST[firstName]) and then checking it with the code (shown in the prior post) before redisplaying it in the input field.
So, when I start with "John's car", I end up with "John" in the input field when it redisplays.
Any other suggestions (from anyone)?