user1074438
user1074438

Reputation:

PHP : Preg_match not work when have "/"

This one is killing me:

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'downcom');

This one print 0 , because it wrong.

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.com');

This one print 1 , its right.

My question is: why this one still print 1.

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)/",'down.c/om');

I want my preg_match check domain , domain.com only. I don't want people enter domain.com/asda , but it still allow people enter / even I don't set / in [a-zA-Z0-9-.]+

Thanks your help.

Upvotes: 3

Views: 3484

Answers (2)

Jonah Bishop
Jonah Bishop

Reputation: 12581

Let's break down your regular expression to see what it's doing:

([a-zA-Z0-9\-\.]+)

This first part is saying 1 or more of these characters, which matches "down" just fine.

\.

Then we match a single dot.

([a-zA-Z0-9]+)

Then we match 1 or more of these characters. The 'c' fulfilled the 1 or more rule, so it returns true. If you want to match exactly three characters, change your regular expression to something like:

echo preg_match("/([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})/",'down.c/om');

That should return false, as you expect. Michael's positional anchor tip (from his answer) is also useful, though you'll want to make sure what comes in has been trimmed ($ can match against \n, as I found out yesterday). You could also use the D modifier or the \z assertion to make sure you're at the end of the line. Here's how it might look when put together:

echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]{3})$/D",'down.c/om');

Upvotes: 1

Michael Berkowski
Michael Berkowski

Reputation: 270677

Looks like you just need to add the beginning and end boundaries ^, $:

echo preg_match("/^([a-zA-Z0-9\-\.]+)\.([a-zA-Z0-9]+)$/",'down.c/om');
//---------------^^^--------------------------------^^^
// Prints 0

The reason yours failed was that the pattern did in fact match the string down.c, but since you didn't include the $ end of string, any additional characters did not need to match the regex pattern so /om could be ignored. By including $, you force the test string to be matched up to its end.

Upvotes: 2

Related Questions