Presently, I am using this:
if (preg_match ('/^[a-zA-Z0-9_]+([a-zA-Z0-9_]*[.-]?[a-zA-Z0-9_]*)*[a-zA-Z0-9_]+$/', $product) ) {
return true;
} else {
return false
}
For example, I want to match:
pro.duct-name_
_pro.duct.name
p.r.o.d_u_c_t.n-a-m-e
But I don't want to match:
pro..ductname
.productname-
-productname.
-productname
The dot matches all characters in the string --including whitespaces.
Practical Data Science using Python You can use regular expressions to achieve this task. In order to verify that the string only contains letters, numbers, underscores and dashes, we can use the following regex: "^[A-Za-z0-9_-]*$".
The period (.) represents the wildcard character. Any character (except for the newline character) will be matched by a period in a regular expression; when you literally want a period in a regular expression you need to precede it with a backslash.
The answer would be
/^[a-zA-Z0-9_]+([-.][a-zA-Z0-9_]+)*$/
if only you allowed strings containing .-
and -.
NOT to match. Why would you allow them to match, anyway? But if you really need these strings to match too, a possible solution is
/^[a-zA-Z0-9_]+((\.(-\.)*-?|-(\.-)*\.?)[a-zA-Z0-9_]+)*$/
The single .
or -
of the first regex is replaced by a sequence of alternating .
and -
, starting with either .
or -
, optionally followed by -.
or .-
pairs respectively, optionally followed by a -
or .
respectively, to allow for an even number of alternating chars. This complexity is probably an overshoot, but appears to be needed by current specifications. If a max of 2 alternating .
and -
is required, the regex becomes
/^[a-zA-Z0-9_]+((\.-?|-\.?)[a-zA-Z0-9_]+)*$/
Test here or here
Try this
(?im)^([a-z_][\w\.\-]+)(?![\.\-])\b
UPDATE 1
(?im)^([a-z_](?:[\.\-]\w|\w)+(?![\.\-]))$
UPDATE 2
(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$
Explanation
<!--
(?im)^([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)$
Match the remainder of the regex with the options: case insensitive (i); ^ and $ match at line breaks (m) «(?im)»
Assert position at the beginning of a line (at beginning of the string or after a line break character) «^»
Match the regular expression below and capture its match into backreference number 1 «([a-z_](?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+)»
Match a single character present in the list below «[a-z_]»
A character in the range between “a” and “z” «a-z»
The character “_” «_»
Match the regular expression below «(?:\.\-\w|\-\.\w|\-\w|\.\w|\w)+»
Between one and unlimited times, as many times as possible, giving back as needed (greedy) «+»
Match either the regular expression below (attempting the next alternative only if this one fails) «\.\-\w»
Match the character “.” literally «\.»
Match the character “-” literally «\-»
Match a single character that is a “word character” (letters, digits, and underscores) «\w»
Or match regular expression number 2 below (attempting the next alternative only if this one fails) «\-\.\w»
Match the character “-” literally «\-»
Match the character “.” literally «\.»
Match a single character that is a “word character” (letters, digits, and underscores) «\w»
Or match regular expression number 3 below (attempting the next alternative only if this one fails) «\-\w»
Match the character “-” literally «\-»
Match a single character that is a “word character” (letters, digits, and underscores) «\w»
Or match regular expression number 4 below (attempting the next alternative only if this one fails) «\.\w»
Match the character “.” literally «\.»
Match a single character that is a “word character” (letters, digits, and underscores) «\w»
Or match regular expression number 5 below (the entire group fails if this one fails to match) «\w»
Match a single character that is a “word character” (letters, digits, and underscores) «\w»
Assert position at the end of a line (at the end of the string or before a line break character) «$»
-->
And you could test it here.
This should do:
/^[A-z0-9_]([.-]?[A-Z0-9_]+)*[.-]?[A-z0-9_]$/
It will make sure that the word begins and ends with alphanumeric or underscore character. The bracket in the middle will make sure that there will be at most one period or dash in a row, followed by at least one alphanumeric or underscore character.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With