所以我正在开展一个项目,允许用户从PokerStars等网站输入扑克手牌历史,然后向他们展示手牌。
看起来正则表达式对于这一点来说是一个很好的工具,但是我将我的正则表达式的知识排在“苗条到无”。
所以我正在使用PHP并逐行循环遍历这个文本块,如下所示:
Seat 1: fabulous29 (835 in chips)
Seat 2: Nioreh_21 (6465 in chips)
Seat 3: Big Loads (3465 in chips)
Seat 4: Sauchie (2060 in chips)
我想提取座位number, name, & chip count
,因此格式为
Seat [number]: [letters&numbers&characters] ([number] in chips)
我没有IDEA从哪里开始,或者我甚至应该用什么命令来优化它。
非常感谢任何建议 - 即使它只是指向PHP正则表达式教程的链接或我应该使用的命令的名称。
答案 0 :(得分:4)
我并不完全确定在没有尝试的情况下究竟要使用什么,但是我一直用来验证我的RegEx的一个很好的工具是RegExr,它为试用你的正则表达式提供了一个很棒的flash接口,包括实时匹配和要使用的预定义片段库。绝对是一个很好的节省时间:))
答案 1 :(得分:4)
这样的事情可能会起到作用:
/Seat (\d+): ([^\(]+) \((\d+)in chips\)/
关于Regex如何运作的一些基本解释:
\ d = digit。
\<字符> =转义字符,如果不是任何字符类或子表达式的一部分。例如:
\t
将呈现一个标签,而\\t
将呈现“\ t”(因为反斜杠被转义)。
+ =前面一个或多个元素。
* =前面元素的零个或多个。
[] =括号表达式。匹配括号内的任何字符。也适用于范围(例如A-Z)。
[^] =匹配不在括号内的任何字符。
()=标记的子表达式。在此范围内匹配的数据可以在以后调用。
无论如何,我选择使用
([^\(]+)
因为该示例提供了包含空格的名称(示例中的Seat 3)。这样做的是它匹配任何角色直到它遇到一个开头的paranthesis。 这将在子表达式的末尾留下一个空格(使用示例中提供的数据)。但是,可以使用PHP中的trim()命令轻松删除它。
如果你不想匹配空格,只有字母数字字符,你可以这样:
([A-Za-z0-9-_]+)
哪个匹配任何字母(在A-Z内,包括大写和小写),数字以及连字符和下划线。
或相同的变体,带空格:
([A-Za-z0-9-_\s]+)
将“\ s”评估为空格。
希望这会有所帮助:)
答案 2 :(得分:2)
查看PHP手册中的PCRE部分。此外,http://www.regular-expressions.info/是学习正则表达式的绝佳网站。免责声明:一旦你学会了正则表达式就会让人上瘾。
答案 3 :(得分:2)
我总是在PHP中使用REGEX的preg_函数集,因为PERL兼容表达式具有更多功能。这个额外的功能并不一定在这里发挥作用,但它们也应该更快,所以为什么不使用它们呢,对吧?
对于表达式,请尝试:
/Seat (\d+): ([^ ]+) \((\d+)/
您可以在每一行上使用preg_match(),将结果存储在数组中。然后,您可以根据自己的喜好获得这些结果并进行操作。
编辑:
顺便说一句,你也可以在整个文本块上运行pre _
匹配_
(而不是逐行循环)并以这种方式获得结果。
答案 4 :(得分:1)
结帐preg_match。 可能正在寻找类似......的东西。
<?php
$str = 'Seat 1: fabulous29 (835 in chips)';
preg_match('/Seat (?<seatNo>\d+): (?<name>\w+) \((?<chipCnt>\d+) in chips\)/', $str, $matches);
print_r($matches);
?>
*自从我做了php以来已经有一段时间了,所以这个可以有点或很多。*
答案 5 :(得分:1)
答案 6 :(得分:0)
以下是我目前正在使用的内容:
preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
答案 7 :(得分:0)
要一次处理整个输入字符串,请使用preg_match_all()
preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);
对于您的输入字符串,$ matches的var_dump将如下所示:
array
0 =>
array
0 => string 'Seat 1: fabulous29 (835 in chips)' (length=33)
1 => string 'Seat 2: Nioreh_21 (6465 in chips)' (length=33)
2 => string 'Seat 4: Sauchie (2060 in chips)' (length=31)
1 =>
array
0 => string '1' (length=1)
1 => string '2' (length=1)
2 => string '4' (length=1)
2 =>
array
0 => string '835' (length=3)
1 => string '6465' (length=4)
2 => string '2060' (length=4)
学习正则表达式:获取掌握正则表达式,第3版。如果你真的想要学习正则表达式,那么本书就没有其他任何内容了。尽管它是正则表达式的权威指南,但这本书非常适合初学者。
答案 8 :(得分:0)
试试这段代码。它对我有用
假设您有以下字符串
$string1 = "Seat 1: fabulous29 (835 in chips)";
$string2 = "Seat 2: Nioreh_21 (6465 in chips)";
$string3 = "Seat 3: Big Loads (3465 in chips)";
$string4 = "Seat 4: Sauchie (2060 in chips)";
添加到数组
$lines = array($string1,$string2,$string3,$string4);
foreach($lines as $line )
{
$seatArray = explode(":", $line);
$seat = explode(" ",$seatArray[0]);
$seatNumber = $seat[1];
$usernameArray = explode("(",$seatArray[1]);
$username = trim($usernameArray[0]);
$chipArray = explode(" ",$usernameArray[1]);
$chipNumber = $chipArray[0];
echo "<br>"."Seat [".$seatNumber."]: [". $username."] ([".$chipNumber."] in chips)";
}
答案 9 :(得分:-1)
Seat [number]: [letters&numbers&characters] ([number] in chips)
你的正则表达式看起来应该是这样的
Seat (\d+): ([a-zA-Z0-9]+) \((\d+) in chips\)
使用括号可以捕获座位编号,名称和筹码数量。
答案 10 :(得分:-1)
你必须按换行符分割文件, 然后循环到每一行并应用以下逻辑
$seat = 0;
$name = 1;
$chips = 2;
foreach( $string in $file ) {
if (preg_match("Seat ([1-0]): ([A-Za-z_0-9]*) \(([1-0]*) in chips\)", $string, $matches)) {
echo "Seat: " . $matches[$seat] . "<br>";
echo "Name: " . $matches[$name] . "<br>";
echo "Chips: " . $matches[$chips] . "<br>";
}
}
我没有运行此代码,因此您可能需要修复一些错误......