Solved

PHP Regular Expression and Apostrophe!

Posted on 2006-06-12
16
1,382 Views
Last Modified: 2013-11-30
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
Comment
Question by:mynamebecory2
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 8
  • 7
16 Comments
 

Expert Comment

by:krite
ID: 16886655
Try

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

Author Comment

by:mynamebecory2
ID: 16887031
It throws an error saying that ''' is an invalid modifier.  I am using PHP v5
0
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16887055
With my original code it simply denies it as if it were improper input.  
0
The Orion Papers

Are you interested in becoming an AWS Certified Solutions Architect?

Discover a new interactive way of training for the exam.

 
LVL 8

Expert Comment

by:Autogard
ID: 16887102
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
 
LVL 8

Expert Comment

by:Autogard
ID: 16887140
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
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16887192
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
 
LVL 8

Expert Comment

by:Autogard
ID: 16887214
Can you give us the $input you are passing in?
0
 
LVL 8

Expert Comment

by:Autogard
ID: 16887240
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
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16887362
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
 
LVL 8

Accepted Solution

by:
Autogard earned 55 total points
ID: 16887429
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
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16887809
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
 
LVL 8

Expert Comment

by:Autogard
ID: 16888116
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
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16888206
Well, I didn't fix it...  I found the problem :)
Your regex works great, but it fails when passed through a form!?!
0
 
LVL 8

Expert Comment

by:Autogard
ID: 16888258
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
 
LVL 1

Author Comment

by:mynamebecory2
ID: 16893741
Web Host had magic quotes on after all.  All fixed! :)
0
 
LVL 8

Expert Comment

by:Autogard
ID: 16893967
Great!  Yeah it sure looked like you were getting some garbled post data.  Glad things are working!
0

Featured Post

PeopleSoft Has Never Been Easier

PeopleSoft Adoption Made Smooth & Simple!

On-The-Job Training Is made Intuitive & Easy With WalkMe's On-Screen Guidance Tool.  Claim Your Free WalkMe Account Now

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Australian government abolished Visa 457 earlier this April and this article describes how this decision might affect Australian IT scene and IT experts.
When the s#!t hits the fan, you don’t have time to look up who’s on call, draft emails, call collaborators, or send text messages. An instant chat window is definitely the way to go, especially one like HipChat. HipChat is a true business app. An…
There's a multitude of different network monitoring solutions out there, and you're probably wondering what makes NetCrunch so special. It's completely agentless, but does let you create an agent, if you desire. It offers powerful scalability …
Monitoring a network: why having a policy is the best policy? Michael Kulchisky, MCSE, MCSA, MCP, VTSP, VSP, CCSP outlines the enormous benefits of having a policy-based approach when monitoring medium and large networks. Software utilized in this v…

729 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question