• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 1457
  • Last Modified:

PHP Regular Expression and Apostrophe!

For the life of me I cannot get apostrophe usage down with Perl Regular Expressions.  Here is my regex:

if(preg_match('/^[a-zA-Z\'\.-]{2,30}$/',$input)){
      echo 'Hooray!';
}

My goal is for it to accept 2 - 30 alpha characters and periods, hyphens and apostrophes.  Everything works except apostrophes.  

0
mynamebecory2
Asked:
mynamebecory2
  • 8
  • 7
1 Solution
 
kriteCommented:
Try

if(preg_match('/^[a-zA-Z/\'/\.-]{2,30}$/',$input)){
     echo 'Hooray!';
}
0
 
mynamebecory2Author Commented:
It throws an error saying that ''' is an invalid modifier.  I am using PHP v5
0
 
mynamebecory2Author Commented:
With my original code it simply denies it as if it were improper input.  
0
Network Scalability - Handle Complex Environments

Monitor your entire network from a single platform. Free 30 Day Trial Now!

 
AutogardCommented:
Can you just put your regular expression pattern in double quotes instead of single?

if(preg_match("/^[a-zA-Z\'\.-]{2,30}$/",$input)){
     echo 'Hooray!';
}
0
 
AutogardCommented:
I believe you could also, if you want to keep single-quoting in your coding style do something like this (yes, that's three backslashes before the single quote), but I'd recommend my first suggestion (above)...

if(preg_match('/^[a-zA-Z\\\'\.-]{2,30}$/',$input)){
     echo 'Hooray!';
}
0
 
mynamebecory2Author Commented:
Still denies it... Here is my exact code:


function validateName($input){
      #Cannot get apostrophe to work.
      $errorMsg = 'May only consist of (a-z, A-Z, \', ., -, and space)';
      if($input == ''){
            $errorMsg = 'This item is required.';
      } else if(preg_match("/^[a-zA-Z\'\.-]{2,30}$/",$input)){
            $errorMsg = '';
      }
      return $errorMsg;
}

I tried it the second way with the single quotes and 3 slashes and it denied as well.
0
 
AutogardCommented:
Can you give us the $input you are passing in?
0
 
AutogardCommented:
By the way... it says that you are allowing spaces, but the regular expression pattern doesn't have a space in it (I don't know if experts-exchange is just trimming out that space for some reason).  So if your input has a space in it it will fail the regular expression.

This should have a space in it (before the closing "]"):
"/^[a-zA-Z\'\.- ]{2,30}$/"

Maybe it needs to be quoted:
"/^[a-zA-Z\'\.-\ ]{2,30}$/"

Sorry, just testing it -- I've seen spaces get trimmed out before.
0
 
mynamebecory2Author Commented:
I took the space out, I thought it was causing the problem.  The code above is exact, EE isn't stripping anything.

The input is these three names.  The function is called from a loop.

O'Dell
O'Brian
O'Brian-Mc.Donald (What an unfortunate married name eh?)
0
 
AutogardCommented:
This exact code works just fine on my system:

<?php

function validateName($input)
{
  $errorMsg = 'May only consist of (a-z, A-Z, \', ., -, and space)';

  if(preg_match("/^[a-zA-Z\'\.-]{2,30}$/",$input))
  {
       $errorMsg = '';
  }

  return $errorMsg;
}

$namesArray = array("O'Dell", "O'Brian", "O'Brian-Mc.Donald");

foreach($namesArray as $input)
{
  print "Input: $input, Message: \"" . validateName($input) . "\".<br>";
}

?>

Output:
Input: O'Dell, Message: "".
Input: O'Brian, Message: "".
Input: O'Brian-Mc.Donald, Message: "".

...what are you getting back from your call to the function?  If you are getting back the empty string it means that your regular expression passed (because you are setting errorMsg to '').
0
 
mynamebecory2Author Commented:
I think I found the problem...  I don't know what it is, but I found it :)

My loop isn't in the same file.  Its submitting it through a form...  So its actually coming in as post data.  If I take the regexp and put it in a new .php file and run it it works fine.  When I do it through the form it fails.  Magic quotes are turned off and I am not adding slashes (at this time).
0
 
AutogardCommented:
Glad you fixed it!  So if I understand correctly you are passing those last names (with quotes, etc...) through a form and then checking them against a regular expression?

To further help with this I would try printing out each name before you check the regular expression to see how the form is handling those special characters.
0
 
mynamebecory2Author Commented:
Well, I didn't fix it...  I found the problem :)
Your regex works great, but it fails when passed through a form!?!
0
 
AutogardCommented:
Yes, so you are passing "O'Brian-Mc.Donald" through a form and reading it like $_POST["lastname"].

Before you check the regular expression try printing out the value and let us know what it is (so that we can see what is happening to the form value when it comes through).  Then we'll be able to help you fix it.
0
 
mynamebecory2Author Commented:
Web Host had magic quotes on after all.  All fixed! :)
0
 
AutogardCommented:
Great!  Yeah it sure looked like you were getting some garbled post data.  Glad things are working!
0
Question has a verified solution.

Are you are experiencing a similar issue? Get a personalized answer when you ask a related question.

Have a better answer? Share it in a comment.

Join & Write a Comment

Featured Post

Ultimate Tool Kit for Technology Solution Provider

Broken down into practical pointers and step-by-step instructions, the IT Service Excellence Tool Kit delivers expert advice for technology solution providers. Get your free copy now.

  • 8
  • 7
Tackle projects and never again get stuck behind a technical roadblock.
Join Now