Поэтому я работаю над проектом, который позволит пользователям вводить историю покерных рук с таких сайтов, как 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)
У меня НЕТ ИДЕИ, с чего начать или какие команды я должен использовать, чтобы оптимизировать это.
Любой совет приветствуется - даже если это просто ссылка на учебник по PHP regex или название команды, которую я должен использовать.
Посмотрите на раздел PCRE в Руководстве по PHP. Кроме того, http://www.regular-expressions.info/ является отличным сайтом для изучения регулярных выражений. Отказ от ответственности: Regex очень затягивает, как только вы его изучите.
Я не совсем уверен, что именно использовать для этого, не пытаясь сделать это, но отличный инструмент, который я все время использую для проверки моего RegEx, - это RegExr, который предоставляет отличный флэш-интерфейс для проверки вашего регулярного выражения, включая сопоставление в реальном времени и библиотеку. предопределенных фрагментов для использования. Определенно отличная экономия времени :)
Я всегда использую набор функций preg_ для REGEX в PHP, потому что PERL-совместимые выражения имеют гораздо больше возможностей. Эти дополнительные возможности не обязательно вступают в игру, но они также должны быть быстрее, так почему бы не использовать их в любом случае, верно?
Для выражения попробуйте это:
/Seat (\d+): ([^ ]+) \((\d+)/
Вы можете использовать preg_match () в каждой строке, сохраняя результаты в массиве. Затем вы можете получить эти результаты и манипулировать ими по своему усмотрению.
РЕДАКТИРОВАТЬ:
Кстати, вы также можете запустить preg _
match _
all для всего блока текста (вместо циклического прохождения строки за строкой) и получить результаты таким же образом.
Seat [number]: [letters&numbers&characters] ([number] in chips)
Ваш Regex должен выглядеть примерно так
Seat (\d+): ([a-zA-Z0-9]+) \((\d+) in chips\)
Скобки позволят вам зафиксировать номер места, название и количество фишек в группах.
вам нужно будет разбить файл на разрывы строк, затем перебрать каждую строку и применить следующую логику
$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>";
}
}
Я не запускал этот код, поэтому вам, возможно, придется исправить некоторые ошибки ...
Вот что я сейчас использую:
preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)
Проверьте 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, так что это может быть немного или много. *
Нечто подобное может сработать:
/Seat (\d+): ([^\(]+) \((\d+)in chips\)/
И некоторые основные объяснения того, как работает Regex:
\ d = цифра
\ <символ> = экранирует символ, если не является частью какого-либо класса символов или подвыражения. например:
\t
будет отображать вкладку, в то время как\\t
будет отображать "\ t" (поскольку обратный слеш экранируется).+ = один или несколько из предыдущего элемента.
* = ноль или более предыдущего элемента.
[] = выражение в скобках. Соответствует любому из символов в скобках. Также работает с диапазонами (например, AZ).
[^] = Соответствует любому символу, который НЕ находится в скобках.
() = Отмеченное подвыражение. Соответствующие данные могут быть вызваны позже.
Во всяком случае, я решил использовать
([^\(]+)
поскольку в примере указано имя, содержащее пробелы (место 3 в примере). то, что это делает, - то, что это соответствует любому символу вплоть до того, что это встречает вводный паратез. Это оставит вас с пробелом в конце подвыражения (используя данные, приведенные в примере). Однако его можно легко удалить с помощью команды trim () в PHP.
Если вы не хотите сопоставлять пробелы, только буквенно-цифровые символы, вы можете сделать что-то вроде этого:
([A-Za-z0-9-_]+)
Который будет соответствовать любой букве (в пределах AZ, как в верхнем, так и в нижнем регистре), цифре, а также дефисам и подчеркиванию.
Или тот же вариант с пробелами:
([A-Za-z0-9-_\s]+)
Где "\ s" оценивается как пробел.
Надеюсь это поможет :)
Чтобы обработать всю входную строку одновременно, используйте preg_match_all()
preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);
Для вашей входной строки var_dump из $ match будет выглядеть так:
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-е издание. Ничто другое не подходит близко к этой книге, если вы действительно хотите выучить регулярные выражения. Несмотря на то, что книга является исчерпывающим руководством к регулярным выражениям, книга очень удобна для начинающих.
Попробуйте этот код. Меня устраивает
Допустим, что у вас есть строки строк ниже
$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)";
}
Может быть, очень поздно ответить, но мне интересно отвечать
Seat\s(\d):\s([\w\s]+)\s\((\d+).*\)