gpt4 book ai didi

php - preg_match 捕获特殊字符后的字符串部分

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:01:29 26 4
gpt4 key购买 nike

我有一个包含字符串的文本文件,对于每个字符串,我需要划分并捕获它的每个部分。

字符串是这样的:

Joao.Martins.G2R71.Pedro.Feliz.sno

Being: NAME 1st player (only first or first+surname) G = game (can be 2 or 02 or other number less than 99) ; R = 结果(在本例中主队 wis 7x1)和 NAME 2nd player ... 最后 3 个字符是游戏类型(本例斯诺克)

但字符串也可以是:

Joao Martins |2x71| Pedro Feliz.poo

我不是 Regex 专家(遗憾的是)并且已经在这里搜索了很多问题而没有找到解决方案,或者就此而言甚至只是通过阅读其他问题的答案来获得帮助(主要是因为我似乎从来没有理解过这一点)

我已经有了这个:

preg_match("/\[(|^|]+)\]/",$string,$result);
echo $result[1] . "<br />";

但这只给了我 | 之间的所有东西|部分甚至不分开它们并忽略其他一切

你们能帮我解决这两种情况吗?我像往常一样完全迷失在这里!

提前致谢!

最佳答案

展开方式:

你不必使用复杂的正则表达式,你可以使用简单的 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 个部分,你会习惯 *?(贪婪 killer )。

$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个名字)

如果玩家可能有超过 2 个名字(比如 Armin Van Buuren),你应该像这样使用正则表达式:

~^([\w.]+)\.G(\d+)R(\d+)\.([\w.]+)\.(\w+)$~

这将匹配 Albert.EinsteinArmin.Van.Buuren 中的名称(regexp 依赖于该名称不包含 \d (十进制数)所以像 Gerold The 3rd 这样的名字将不匹配)。

你应该只使用:~^([\w\d.]+)\.G(\d+)R(\d+)\.([\w\d.]+)\.(\w+)$~ 也匹配 Gerold The 3rd 和任何其他名称 (\.G(\d+)R(\d+)\. 非常严格,你必须编出非常疯狂的名字,如 G3R01(如“3l1t33 kid Gerold”)才能解析错误。

哦还有一件事,别忘了$name = strtr( $name, '.', ' ') :)

正则表达式解释

  • ~~ - regexp delimiter ;开始结束结束正则表达式; ~regexp~,它几乎可以是任何/regexp/, (regexp)
  • ^$ - meta characters ;^ 字符串/行开始,$ 字符串/行结束
  • \wescape sequence对于任何单词字符,与 [a-zA-Z]
  • 相同
  • ([\w.]+) - 捕获 subpatern/match group what 包含 [a-zA-Z.] 至少一次。 + 被称为 quantifier
  • +? - ?(在其他量词之后)被称为贪心 killer ,它的意思是尽可能少拿,通常(\w+)a 将匹配(在字符串 ababa 上)abab(\w+?)a 将匹配 ab(\w*?)a 将匹配空字符串 :)

关于php - preg_match 捕获特殊字符后的字符串部分,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217983/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com