PwnageAtPwn
PwnageAtPwn

Reputation: 431

PHP Regular Expression Failing

My current regular expression should be correct, though I wouldn't expect so, it doesn't work properly. It won't return "Got Match" My currrent code is as follows:

$id = "http://steamcommunity.com/id/TestID";
    if (preg_match("^http://steamcommunity\.com/id/.*?\n$", $id)) {
        print "Got match!\n";
    }

Upvotes: 0

Views: 448

Answers (9)

Diblo Dk
Diblo Dk

Reputation: 663

As the say your patten is start and end wrong. (Delimiter)
But this will be a better match of a 64-bit Steam ID. (Minimum 17 and Maximum 25 numbers)

if( preg_match("#^http://steamcommunity\.com/id/([0-9]{17,25})#i", $id, $matches) )
{
    echo "Got match! - ".$matches;
}

I believe that there is no need for you to require that the string must end with a line break.

Explanation.

http://steamcommunity\.com/id/([0-9]{17,25})
^---       string         ---^^-- Regexp --^

[0-9] - Match a number between 0 to 9
{17,25} - Make 17 to 25 matches
() - Returns match

Or use pattern as those (It is the same):

/^http:\/\/steamcommunity\.com\/id\/([0-9]{17,25})/i
(^http://steamcommunity\.com/id/([0-9]{17,25}))i

Regular Expressions PHP Tutorial
Online regular expression testing <- Dont use delimiter.

Upvotes: 0

yunzen
yunzen

Reputation: 33439

You need to have starting and ending delimiter in your pattern like /pattern/ or #pattern# or with brackets (pattern). Why is that? To have some pattern modifiers after ending delimiter like #pattern#i (ignore case)

preg_match('(^http://steamcommunity\.com/id/.*?\n$)', $id)

Upvotes: 1

Jan Dragsbaek
Jan Dragsbaek

Reputation: 8101

You need a delimiter, like this:

if (preg_match("#^http://steamcommunity\.com/id/.*?$#", $id)) {
                ^                                   ^

And what's with the newline at the end? Surely you don't need that.

Upvotes: 3

NullUserException
NullUserException

Reputation: 85468

First of all, your regex shouldn't even compile because it's missing delimiters.

if (preg_match("~^http://steamcommunity\.com/id/.*?\n$~", $id)) {
                ^----      these guys here       -----^

Second of all, why do you have a \n if your string doesn't contain a new line?

And finally, why are you using regex at all? Effectively, you are just trying to match a constant string. This should be equivalent to what you are trying to match:

if (strpos($id, 'http://steamcommunity.com/id/') === 0) {

Upvotes: 1

Alex Turpin
Alex Turpin

Reputation: 47776

There are a couple of things that are wrong with it. First of all, you need to delimit the start and end of your regex with a character. I used #. You're also matching for a new line at the end of your regex, which you don't have and likely won't ever have in your string.

<?php
    $id = "http://steamcommunity.com/id/TestID";
    if (preg_match("#^http://steamcommunity\.com/id/.*?$#", $id)) {
        print "Got match!\n";
    }
?>

http://codepad.viper-7.com/L7XctT

Upvotes: 1

tom at zepsu dot com
tom at zepsu dot com

Reputation: 307

<?php
  # URL that generated this code:
  # http://txt2re.com/index-php.php3?s=http://steamcommunity.com/id&-1

  $txt='http://steamcommunity.com/id';

  $re1='(http:\\/\\/steamcommunity\\.com\\/id)';    # HTTP URL 1

  if ($c=preg_match_all ("/".$re1."/is", $txt, $matches))
  {
      $httpurl1=$matches[1][0];
      print "($httpurl1) \n";
  }

  #-----
  # Paste the code into a new php file. Then in Unix:
    # $ php x.php 
  #-----
?>

Resorces: http://txt2re.com/index.php3?s=http://steamcommunity.com/id&-1

Upvotes: -2

Marc B
Marc B

Reputation: 360692

You're missing delimiters on your regex:

if (preg_match("#^http://steamcommunity\.com/id/.*?\n$#", $id)) {
                ^--here                               ^--here

Note that I've used # as the delimiter here, since that saves you having to escape all of the internal / charrs, if you'd used the traditional / as the delimiter.

Upvotes: 4

SERPRO
SERPRO

Reputation: 10067

You need to add the pattern delimiter:

$id = "http://steamcommunity.com/id/TestID";
if (preg_match("#^http://steamcommunity\.com/id/.*?(\n|$)#", $id)) {
   print "Got match!\n";
}

Upvotes: 2

Wiseguy
Wiseguy

Reputation: 20883

You're missing delimiters. For example:

"#^http://steamcommunity\.com/id/.*?\n$#"

Also, you're trying to match a newline (\n) that isn't in your string.

Upvotes: 2

Related Questions