• 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

    • Hello mysterious lamborghiniv10, I was in Australia and... now I'm in the Netherlands. 
    • EU says Meta must restore rival chatbots' access to WhatsApp by Hamid Ganji The European Commission has ordered Meta to restore third-party AI chatbots’ access to WhatsApp after the tech giant decided to block them from operating on the popular messaging platform. After Meta banned rival AI chatbots from operating on WhatsApp, the European Commission launched an antitrust investigation to determine whether the company had abused its market dominance. As a result of Meta’s decision, third-party AI chatbots, including Microsoft’s Copilot and OpenAI’s ChatGPT, were prevented from operating on WhatsApp. At the time, Meta said it wanted to reserve the WhatsApp Business API for other types of businesses and did not allow rival chatbots to use it. This effectively prevented the WhatsApp ecosystem from being used to distribute rival chatbot services. However, the European Commission has now announced an interim measures decision requiring Meta to restore access to WhatsApp for rival general-purpose AI assistants on the same terms and conditions as before October 15, 2025. The Commission has also asked Meta to maintain that access until the antitrust investigation is concluded. The Commission argues that Meta has used its dominant market position to prevent rival AI chatbots from accessing the WhatsApp Business API. While Meta allowed rival services to return to WhatsApp by paying a fee, the European Commission still considers that arrangement to be a de facto access ban. According to EU antitrust chief Teresa Ribera, the fees introduced by Meta are so high that using WhatsApp is no longer economically sustainable for competitors. “It seems that Meta expects to leverage the vast reach and likely dominance of WhatsApp to benefit its own AI assistant and to foreclose rivals,” Ribera said. “We cannot let large digital incumbents leverage their dominance of the past to dictate who in Europe gets to compete and who gets to innovate in AI.”
    • A few years ago walmart had the 512 models on clearance for $35. I bought 3 of them. I should have purchased more.
    • I'm fine with a little reasonable promotion of Edge, but the degree which they do it right now I consider extremely unreasonable. 
    • Microsoft AI boss no longer believes that AI will replace human workers by David Uzondu Mustafa Suleyman, the head of Microsoft AI, recently took back his statements concerning white-collar jobs that he gave to the Financial Times in an interview made back in February, where he claimed that AI would replace office workers within 12 to 18 months. On Monday's episode of The Verge's Decoder, Suleyman recast the technology as more like a helpmate than a tool designed to take over your job. He explained that smaller office duties will "increasingly become digitized, automated" as people generate more digital materials. During the discussion, Suleyman emphasized a "very important distinction" between "tasks" and "jobs" to clarify his previous claims. He argued that his earlier comments only referred to individual actions that people perform at their desks. Suleyman used to work for DeepMind, the research lab he co-founded in 2010 alongside Demis Hassabis and Shane Legg, before he left in 2022 to establish Inflection AI and build an empathetic digital assistant. Microsoft hired him in March 2024 to lead its newly formed "Microsoft AI" division, placing him in charge of consumer products like Copilot, Bing, and Edge. His February comments also detailed plans for Microsoft to achieve self-sufficiency with a $140 billion infrastructure budget to train frontier models, predicting that creating a customized AI will soon feel like creating a podcast or a new blog: The 41-year-old is not the only AI executive who's softened his "AI will replace you" stance. OpenAI's CEO, Sam Altman, last month used X to push back against employment panic by arguing that his startup builds tools to assist humans rather than build replacements. He had previously garnered backlash by suggesting that many modern office roles that AI might replace did not qualify as "real work" in the first place, at least when you compare desk jobs to physical, historical labor like farming.
  • Recent Achievements

    • One Year In
      Primer1st earned a badge
      One Year In
    • Experienced
      JayZJay went up a rank
      Experienced
    • Reacting Well
      Sir_Timbit earned a badge
      Reacting Well
    • Week One Done
      rubentuben8 earned a badge
      Week One Done
    • Week One Done
      ARaclen earned a badge
      Week One Done
  • Popular Contributors

    1. 1
      +primortal
      512
    2. 2
      PsYcHoKiLLa
      229
    3. 3
      Edouard
      134
    4. 4
      ATLien_0
      87
    5. 5
      Steven P.
      80
  • Tell a friend

    Love Neowin? Tell a friend!