I have a string of tfa_2,tfa_3,tfa_4 and I have a regex of /^tfa_\d+/
How can I make it select all the tfa_1...tfa_999 and disregard the comma?
Thanks.
^tfa_\d+(,tfa_\d+)*$ and no limit on the number after tfa_The simplest solution is to use explode:
$tokens = explode(",", "tfa_2,tfa_3,tfa_4");
You can also use preg_split or preg_match, but they are overkill under this assumption:
$tokens = preg_split('/,/', "tfa_2,tfa_3,tfa_4");
$retcode = preg_match_all('/tfa_\d+/', "tfa_2,tfa_3,tfa_4", $tokens);
^[^,]+(,[^,]+)*$, no quoted token, and no limit on the number after tfa_You need to assert that tfa_\d+ is not preceded or suceeded by a non-separator (non-comma character) to prevent htfa_345, tfa_456xxx, -tfa_34 from being considered a match:
$retcode = preg_match_all('/(?<![^,])tfa_\d+(?![^,])/', "tfa_2,tfa_3,tfa_4,htfa_345,tfa_456xxx,-tfa_34", $tokens);
Alternate solution, by explode the string along , and use array_filter to filter out unwanted fields:
$fields = explode(",", "tfa_2,tfa_3,tfa_4,htfa_345,tfa_456xxx,-tfa_34");
$tokens = array_filter($fields, function ($v) {
return preg_match('/^tfa_\d+$/', $v) == 1;
});
^[^,]+(,[^,]+)*$, no quoted token, and the number after tfa_ can only be 1 to 999Just modify the regex a bit to limit the number ([1-9]\d{0,2}):
$retcode = preg_match_all('/(?<![^,])tfa_[1-9]\d{0,2}(?![^,])/', "tfa_2,tfa_3,tfa_4456,htfa_345,tfa_456xxx,-tfa_34", $tokens);
Similar modification for explode + array_filter solution:
$fields = explode(",", "tfa_2,tfa_3,tfa_4456,htfa_345,tfa_456xxx,-tfa_34");
$tokens = array_filter($fields, function ($v) {
return preg_match('/^tfa_[1-9]\d{0,2}$/', $v) == 1;
});
From the update and the comments,
/(tfa_\d{1,3})+/g
In PHP:
$re = "/(tfa_\\d{1,3})+/";
$str = "tfa_1,tfa_002,tfa_999,tfa_xxx";
preg_match_all($re, $str, $matches);
Will match tfa_1, tfa_002, tfa_999 but not tfa_xxx or tfa_
tfa_\d+.
tfa_\d+tokens, then just usepreg_splitto split at,. If it is not, then also split, then filter the list according to the regex.