GeorgeKaf
GeorgeKaf

Reputation: 613

Detect cloth sizes with regex

I am trying to detect with regex, strings that have a pattern of {any_number}{x-}{large|medium|small} for a site with clothing I am building in PHP. I have managed to match the sizes against a preconfigured set of strings by using:

$searchFor = '7x-large';
$regex = '/\b'.$searchFor.'\b/';

//Basically, it's finding the letters 
//surrounded by a word-boundary (the \b bits). 
//So, to find the position:
preg_match($regex, $opt_name, $match, PREG_OFFSET_CAPTURE);

I even managed to detect weird sizes like 41 1/2 with regex, but I am not an expert and I am having a hard time on this.

I have come up with

preg_match("/^(?<![\/\d])([xX\-])(large|medium|small)$/", '7x-large', $match);

but it won't work.

Could you pinpoint what I am doing wrong?

Upvotes: 0

Views: 863

Answers (2)

zx81
zx81

Reputation: 41848

It sounds like you also want to match half sizes. You can use something like this:

$theregex = '~(?i)^\d+(?:\.5)?x-(?:large|medium|small)$~';
if (preg_match($theregex, $yourstring,$m)) {
    // Yes! It matches!
    // the match is $m[0]
    } 
else { // nah, no luck...
     }

Note that the (?i) makes it case-insensitive.

This also assumes you are validating that an entire string conforms to the pattern. If you want to find the pattern as a substring of a larger string, remove the ^ and $ anchors:

$theregex = '~(?i)\d+(?:\.5)?x-(?:large|medium|small)~';

Upvotes: 1

AdrianHHH
AdrianHHH

Reputation: 14076

Look at the specification you have and build it up piece by piece. You want "{any_number}{x-}{large|medium|small}".

"{any_number}" would be \d+. This does not allow fractional numbers such as 12.34, but the question does not specify whether they are required.

"{x-}" is a simple string x-

"{large|medium|small}" is a choice between three alternatives large|medium|small.

Joining the pieces together gives \d+x-(large|medium|small). Note the brackets around the alternation, without then the expression would be interpreted as (\d+x-large)|medium|small.

You mention "weird sizes like 41 1/2" but without specifying how "weird" the number to be matched are. You need a precise specification of what you include in "weird" before you can extend the regular expression.

Upvotes: 1

Related Questions