PHP正则表达式查询

PHP正则表达式查询,php,regex,Php,Regex,我只是试着教自己如何使用正则表达式,如果这对某些人来说是微不足道的,那么很抱歉 我正在做一个小剧本。它使用一副标准的扑克牌,我用CDHS(梅花、钻石、红桃、黑桃)作为套装,用A2..9TJQK(王牌,2…9,10,杰克,女王,国王)作为等级 我有一个变量$hand,它是一个偶数长度的卡片串。例如,S2HA3D分别是黑桃2张、红桃王牌和钻石3张。请注意,西装和军衔可以是任意一种 我正在使用: preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i"

我只是试着教自己如何使用正则表达式,如果这对某些人来说是微不足道的,那么很抱歉

我正在做一个小剧本。它使用一副标准的扑克牌,我用
CDHS
(梅花、钻石、红桃、黑桃)作为套装,用
A2..9TJQK
(王牌,2…9,10,杰克,女王,国王)作为等级

我有一个变量
$hand
,它是一个偶数长度的卡片串。例如,
S2HA3D
分别是黑桃2张、红桃王牌和钻石3张。请注意,西装和军衔可以是任意一种

我正在使用:

preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i", $hand, $result);
找到所有的牌,但这将按找到的顺序返回西装和等级


我的问题是,无论给出的顺序如何,我如何才能让结果给每张卡排名第一。我希望我已经清楚地表达了这一点。

编辑:一开始我没有正确理解你的问题。 下面是您需要做的,您需要进行2个regex调用,例如:

/([CDHS])([A2-9TJQK])/i
然后:

尝试创建一个变量,该变量可以保存第一组值和第二组值。然后,为了获得正确的排名,你需要用第二种模式切换它们


如果我错了,请纠正我,但你不能用一个正则表达式来完成这项工作。

我会使用正则表达式来匹配所有对,然后用一些逻辑将分数重新设置为第一个。这就是我的意思(未经测试)

$grades=数组(2,3,4,5,6,7,8,9,'A','T','J','Q','K');
preg|u match|u all('/((C|D|H|S)[2-9ATJQK]{1}(C|D|H|S))/i',$subject$result,preg|u模式顺序);
对于($i=0;$i
一种方法是将命名捕获与允许使用相同名称的J修饰符一起使用

$pattern = '~(?J)(?<rk>[2-9ATJQK])?(?<su>[CDHS])(?(1)|(?<rk>[2-9ATJQK]))~i';

preg_match_all($pattern, $hand, $matches, PREG_SET_ORDER);

foreach($matches as $match) {
    $result .= $match['rk'] . $match['su'];
}
echo $result;

我不认为只有
preg\u match
才能做到这一点

此函数用于匹配字符串,而不是操纵字符串。但是,您可以在第二遍中执行
preg\u replace

preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i", $hand, $rawResult);
$normalisedResult = preg_replace('/([CDHS])([2-9ATJQK])/i', "$2$1", $rawResult[0]);

如果您想知道,
$1
$2
是对
preg\u replace()

的第一个参数中的括号标识的组的反向引用,是否有某种方法可以使用preg\u replace来重新排序错误的组?我看了一下,它表明有些东西可以重新排序。我只是想知道是否有类似的方法。是的,你可以,但你仍将使用2个正则表达式语句,这与目的背道而驰。
$pattern = '~(?J)(?<rk>[2-9ATJQK])?(?<su>[CDHS])(?(1)|(?<rk>[2-9ATJQK]))~i';

preg_match_all($pattern, $hand, $matches, PREG_SET_ORDER);

foreach($matches as $match) {
    $result .= $match['rk'] . $match['su'];
}
echo $result;
$result = preg_replace('~([2-9ATJQK])?([SCHD])(?(1)|([2-9ATJQK]))~i', '$2$1$3', $hand);
preg_match_all("/[2-9ATJQK][CDHS]|[CDHS][2-9ATJQK]/i", $hand, $rawResult);
$normalisedResult = preg_replace('/([CDHS])([2-9ATJQK])/i', "$2$1", $rawResult[0]);