• 0

[PHP] eregi replacement


Question

I've been using this code to validate user names. It only allows 0-9, a-z, A-Z, spaces...

if ( ! eregi ( "^[0-9A-Z_[:space:]]{1,}$", $username ) )

But now, in PHP 5.3 the ereg and eregi functions are deprecated and will be deleted in PHP 6.0.

How can I do this without eregi?

Edited by MNunes2
Link to comment
https://www.neowin.net/forum/topic/815802-php-eregi-replacement/
Share on other sites

15 answers to this question

Recommended Posts

  • 0

you're close. preg_* functions use perl regular expressions so they have a little extra syntax to them.

preg_match("/^[0-9a-z_ ]+$/i", &username)

mainly the starting and ending slash. the letter 'i' after the ending slash says "do a case insensitive search". that way you can remove the extra A-Z character class.

  • 0
you're close. preg_* functions use perl regular expressions so they have a little extra syntax to them.
preg_match("/^[0-9a-z_ ]+$/i", &username)

mainly the starting and ending slash. the letter 'i' after the ending slash says "do a case insensitive search". that way you can remove the extra A-Z character class.

And what does this +$ and this ^ mean? And where can I learn more about this?

  • 0

a carrot (^) means to assert position at the beginning of the string. so basically.. this pattern needs to start at the very beginning of the string.

the dollar sign ($) means assert position at the end of the string. so the strings needs to end with this pattern as well.

the stuff between the square braces are known as a character class. a group of characters that must exist (in this case). if you left the plus off after the character class then that character class would only be required to match one character. the plus means match at least one of the characters in the character class.. but the more it finds in next to each other the more it will match.

so when you put it all together it says that some string must start with and end with some number, letter, space, or any of the symbols (&, #, _) and it must exist at least once but can exist as many times as possible.

if you leave the carrot or dollar sign off of the expression then a pattern could be satisfied anywhere in the string and would be considered a match. for example.. if you used the pattern "[0-9a-z_ ]+" and tested it against the string "abc;.123" it would match two patterns: "abc" and "123". using the dollar sign and carrot it would start matching and get to "abc" then it would see a semicolon and because a semicolon isnt in the character class the pattern fails because the entire string wasnt the match for the pattern.

the key thing to remember is that a regular expression will look for any match that it can find if you dont use constraints like these.

  • 0
a carrot (^) means to assert position at the beginning of the string. so basically.. this pattern needs to start at the very beginning of the string.

the dollar sign ($) means assert position at the end of the string. so the strings needs to end with this pattern as well.

the stuff between the square braces are known as a character class. a group of characters that must exist (in this case). if you left the plus off after the character class then that character class would only be required to match one character. the plus means match at least one of the characters in the character class.. but the more it finds in next to each other the more it will match.

so when you put it all together it says that some string must start with and end with some number, letter, space, or any of the symbols (&, #, _) and it must exist at least once but can exist as many times as possible.

if you leave the carrot or dollar sign off of the expression then a pattern could be satisfied anywhere in the string and would be considered a match. for example.. if you used the pattern "[0-9a-z_ ]+" and tested it against the string "abc;.123" it would match two patterns: "abc" and "123". using the dollar sign and carrot it would start matching and get to "abc" then it would see a semicolon and because a semicolon isnt in the character class the pattern fails because the entire string wasnt the match for the pattern.

the key thing to remember is that a regular expression will look for any match that it can find if you dont use constraints like these.

It's caret. lol

  • 0
It's caret. lol

:rofl: lol my fingers must be hungry

It seems I will have to learn a lot about this function since ereg functions wont be available anymore. :-( Thanks for the information.

i learned mostly from using regex buddy and reading their docs on their site. i think it's a great app for easing into regular expressions and testing/debugged really complex ones even after you get the hang of it.

http://www.regexbuddy.com/regex.html

  • 0

Hi guys,

been a few years since i've used PHP and was testing out some old stuff I had, and came across the depreciated ereg function.

I was using:

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

which I picked up form somewhere, have no idea how it works, and so have no idea how to turn it into preg_match.

Anyone lend a hand? I tried some solutions already in the thread but didn't have much luck.

My function looks like:

function valid_email($address)

{

// check an email address is possibly valid

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

return true;

else

return false;

}

  • 0

I've been using this code to validate user names. It only allows 0-9, a-z, A-Z, spaces...

if ( ! eregi ( "^[0-9A-Z_[:space:]]{1,}$", $username ) )

But now, in PHP 5.3 the ereg and eregi functions are deprecated and will be deleted in PHP 6.0.

How can I do this without eregi?

I've been using the following code to validate Xbox Live Gamertags in a Stats application. (which is A-Z, a-z, 0-9, spaces)

preg_replace('/[^a-zA-Z0-9\s]/', '', $username);

or if you have more descriptive stuff (like can't start/end with space, can't have 2 spaces in a row, can't start in a number, 15 chars long)

preg_replace('/^(?=.{1,15}$)[a-zA-Z][a-zA-Z0-9]*(?: [a-zA-Z0-9]+)*$/', '', $username);

  • 0

Hi guys,

been a few years since i've used PHP and was testing out some old stuff I had, and came across the depreciated ereg function.

I was using:

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

which I picked up form somewhere, have no idea how it works, and so have no idea how to turn it into preg_match.

Anyone lend a hand? I tried some solutions already in the thread but didn't have much luck.

My function looks like:

function valid_email($address)

{

// check an email address is possibly valid

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

return true;

else

return false;

}

Seeing as you're using newer PHP, I'd suggest filter_var

  • 0

If you want to learn about regular expressions then I would suggest reading up on the Perl Regex man page.

A more user friendly website for learning about regex is http://www.regular-expressions.info/, but this teaches PCRE (Perl Compatible Regular Expressions). As the name suggests the two are mostly the same, but there are some minor inconsistencies.

  • 0

I've been using the following code to validate Xbox Live Gamertags in a Stats application. (which is A-Z, a-z, 0-9, spaces)

preg_replace('/[^a-zA-Z0-9\s]/', '', $username);

\s matches all whitespace, not just spaces. It will also match tabs, line feeds, carriage returns, which are clearly not allowed in XBL gamertags :p

If you want to match only spaces then you should use [^a-zA-Z0-9 ].

Also, rather than match a-zA-Z you could use the /i case-insensitive modifier. With the above changes, the final regex would become:

preg_replace('/[^a-z0-9 ]/i','',$username);

Or if you prefer, you can use \d instead of 0-9:

preg_replace('/[^a-z\d ]/i','',$username);

  • 0

Hi guys,

been a few years since i've used PHP and was testing out some old stuff I had, and came across the depreciated ereg function.

I was using:

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

which I picked up form somewhere, have no idea how it works, and so have no idea how to turn it into preg_match.

Anyone lend a hand? I tried some solutions already in the thread but didn't have much luck.

My function looks like:

function valid_email($address)

{

// check an email address is possibly valid

if (ereg('^[a-zA-Z0-9_\.\-]+@[a-zA-Z0-9\-]+\.[a-zA-Z0-9\-\.]+$', $address))

return true;

else

return false;

}

function valid_email($address)
{
  // check an email address is possibly valid
  return (preg_match('/^[a-z\d_\.\-]+@([a-z\d\-]+)(?:\.(?1))+$/i',$address)) ? true : false;
}

Your original regex matched things like "[email protected]" which is clearly not a valid email address. This one will not match that.

I'm not a PHP programmer so the above may not work if I've got any of the PHP syntax wrong, but I've tried out the regex in another language and it seems to work :)

Edit:

In fact, if top level domains only ever go two levels deep, like ".co.uk," then this regex is probably more appropriate:

function valid_email($address)
{
  // check an email address is possibly valid
  return (preg_match('/^[a-z\d_\.\-]+@([a-z\d\-]+)(?:\.(?1)){1,2}$/i',$address)) ? true : false;
}

This topic is now closed to further replies.
  • Recently Browsing   0 members

    • No registered users viewing this page.
  • Posts

    • I haven't paid for windows since windows 8. So I guess I would be happy to pay for a new version if it meant seeing fewer adverts (none) or product pushes. But that applies to _any_ service or OS.
    • Save 35% on Sony's SS-CS5M2 3-way high-res bookshelf speakers by Taras Buria Sony is currently offering a big discount on its SS-CS5M2 bookshelf speaker, saving you 35% on a set of high-quality audio equipment. The SS-CS5M2 is a passive 3-way bookshelf speaker with a 5.12-inch woofer, a 25 mm soft-dome tweeter, and a 19 mm super tweeter. This design allows different drivers to handle different parts of the sound spectrum for a clearer, more detailed audio when watching movies or listening to music. The compact cabinet size allows you to place these speakers on shelves, desks, or stands, making them a practical choice for apartments, bedrooms, and small living rooms. Despite its compact size, the SS-CS5M2 delivers up to 100 W of power. Note that since the speakers are passive, you will need an amplifier to drive them. However, if you do, you can use them for high-resolution music, thanks to a claimed frequency response of 53 Hz - 50 kHz. It is able to extend so far high in the spectrum as a result of those super tweeters. While they will work with most amplifiers and AV receivers, Sony says this pair is a perfect match for its AV receivers, such as STRDH190, 590, 790, or 1000. Sony CS Bookshelf Speakers SS-CS5M2 3-Way 3-Driver Hi-res - $178 | 36% off on Amazon US This Amazon deal is US-specific and not available in other regions unless specified. This is a first-party seller link (at the time of article publishing); ensure that you also purchase from a first-party seller link only. If you don't like it or want to look at more options, check out the previous deals that we have covered, OR you can also visit Amazon US deals page. Get Prime (SNAP), Prime Video, Audible Plus or Kindle / Music Unlimited. Free for 30 days. As an Amazon Associate, we earn from qualifying purchases.
    • So they somehow expect Apple to easily make it so that if I install say DeepSeek that DS can then handle all the tasks that Siri would be doing while integrated in the OS? That sounds like just rediculous.
    • For ray-tracing, the Radeon RX 9070 XT is better than the GeForce RTX 5070, but worse than the GeForce RTX 5070 Ti The Radeon RX 9070 XT is similar to the GeForce RTX 5070 Ti in rasterization Both AMD and NVIDIA have had serious issues with drivers in the past, so I can't say that one is better or worse than the other. Yes. AMD has better support Linux than does NVIDIA. Use Display Driver Uninstaller (DDU) to uninstall NVIDIA's drivers before installing AMD's drivers. That's up to you. Supplies of memory is unpredictable because AI using up a lot of memory. As a result, there is a lot of volatility in video card prices.
  • Recent Achievements

    • One Month Later
      pinnclepd earned a badge
      One Month Later
    • First Post
      X-No-file earned a badge
      First Post
    • One Month Later
      johnjacobb40 earned a badge
      One Month Later
    • One Year In
      Primer1st earned a badge
      One Year In
    • Experienced
      JayZJay went up a rank
      Experienced
  • Popular Contributors

    1. 1
      +primortal
      510
    2. 2
      PsYcHoKiLLa
      215
    3. 3
      +Edouard
      145
    4. 4
      Steven P.
      88
    5. 5
      ATLien_0
      83
  • Tell a friend

    Love Neowin? Tell a friend!