explode方式:
你不必使用复杂的正则表达式,你可以使用简单的explode。
$parts = explode( '.', $string);
现在是 2 部分或 6 部分,所以你可以这样做:
if( count( $parts) == 6)){
list( $fistName1, $surName1, $string, $fistName2, $surName2, $gameType) = $parts;
} elseif( count( $parts) == 2) {
$gameType = $parts[1];
list( $fistName1, $surName1, $string, $fistName2, $surName2) = explode( $parts[0]);
} else {
echo "Cannot parse";
}
现在解析$gameType :)
if( preg_match( '~^\|(\d+)x(\d+)\|$~', $gameType, $parts)){
$first = $parts[1];
$second = $parts[2];
} elseif( preg_match( '~^G(\d+)R(\d+)$~', $gameType, $parts)){
$first = $parts[1];
$second = $parts[2];
} else {
echo "Cannot parse!";
}
preg_match方式:
第二个正则表达式是故意不同的,所以你可以看到如何编写“吃”整个名字的正则表达式,不管它有 2,3 或 5 个部分,你会习惯*? (贪婪的杀手)。
$match = array();
if( preg_match( '~^(\w+)\.(\w+)\.G(\d+)R(\d+)\.(\w+)\.(\w+)\.(\w+)$~', $text, $match)){
// First way
} elseif (preg_match( '~^([^\|]+)\|(\d+)x(\d+)\|(.*?)\.(\w+)$~', $text, $match)){
// Second way
} else {
// Failed to parse
}
编辑(超过 2 个名字)
如果玩家可能有两个以上的名字(如Armin Van Buuren),你应该像这样使用正则表达式:
~^([\w.]+)\.G(\d+)R(\d+)\.([\w.]+)\.(\w+)$~
这将匹配 Albert.Einstein、Armin.Van.Buuren 中的名称(正则表达式依赖于该名称不会包含 \d(十进制数字),因此像 Gerold The 3rd 这样的名称将不匹配)。
您应该可以只使用:~^([\w\d.]+)\.G(\d+)R(\d+)\.([\w\d.]+)\.(\w+)$~,它也可以匹配 Gerold The 3rd 和任何其他名称(\.G(\d+)R(\d+)\. 非常严格,您必须编造非常疯狂的名称,例如 G3R01(例如“3l1t33孩子 Gerold") 来解析它。
还有一件事,别忘了$name = strtr( $name, '.', ' ') :)
正则表达式解释