Bu dize sadece belirli bölümlerini dönmek için regex yazmak nasıl?

10 Cevap php

Yani kullanıcılar PokerStarsda gibi sitelerden poker eli geçmişlerini girin ve sonra onlara elini görüntülemek sağlayacak bir proje üzerinde çalışıyorum.

Bu regex bunun için harika bir araç olacak gibi görünüyor, ancak ben "hiçbiri ince" benim regex bilgi rütbe.

Yani PHP kullanarak ve böyle hattı ile ve hat metin satırının bu bloğu döngü ediyorum:

Koltuk 1: fabulous29 (cips 835)

Koltuk 2: Nioreh_21 (6465 chips)

Koltuk 3: Büyük Yükler (cips 3465)

Koltuk 4: Sauchie (2060 chips)

Ben koltuk numarası, adı ayıklamak istiyorum, & fiş sayısı böylece biçimi

Koltuk [sayı]: [harfler ve sayılar ve karakterler] (cips [sayı])

Ben nerede bile bu optimize etmek için kullanıyor olmalıdır başlar ya da ne komutları için hiçbir fikrim yok.

Herhangi bir tavsiye büyük takdir - PHP regex ya da ben kullanıyor olmalıdır komut (lar) ın adı bir öğretici için sadece bir bağlantı bile.

10 Cevap

Ben çalışıyorum olmadan kullanmak için tam olarak ne tamamen emin değilim, ama benim RegEx doğrulamak için her zaman kullanmak harika bir araç dahil olmak üzere, regex denemek için harika bir flaş arayüzü verir RegExr hangi gerçek zamanlı eşleştirme ve kullanımı önceden tanımlanmış parçacıkları bir kütüphane. Kesinlikle büyük bir zaman tasarrufu :)

Böyle bir şey hile yapabilir:

/Seat (\d+): ([^\(]+) \((\d+)in chips\)/

Ve Regex nasıl çalıştığı hakkında bazı temel açıklama:

  • \ D = haneli.

  • Herhangi bir karakter sınıfı ya da alt ifadenin bir parçası değilse \ = karakteri kaçar. örneğin:

    \t would render a tab, while \\t would render "\t" (since the backslash is escaped).

  • + = Bir ya da daha fazla öğenin öncesinde.

  • * = Sıfır ya da daha fazla öğenin öncesinde.

  • [] = Dirsek ifade. Parantez içinde herhangi bir karakter ile eşleşir. Ayrıca aralıkları (örneğin A-Z) ile çalışır.

  • [^] = Parantez içinde değil herhangi bir karakter ile eşleşir.

  • () = İşaretli subexpression. Bu içindeki eşleşen veri daha sonra geri çağrılabilir.

Neyse, ben kullanmayı seçti

([^\(]+)

since the example provides a name containing spaces (Seat 3 in the example). what this does is that it matches any character up to the point that it encounters an opening paranthesis. This will leave you with a blank space at the end of the subexpression (using the data provided in the example). However, his can easily be stripped away using the trim() command in PHP.

Eğer boşluk, sadece harflerden maç istemiyorsanız, bu gibi pek bir şey olabilir:

([A-Za-z0-9-_]+)

(Üst ve alt harf hem AZ içinde) herhangi bir harf eşleşmesi hangi numara yanı sıra tire ve alt çizgi.

Veya boşluk ile aynı varyantı:

([A-Za-z0-9-_\s]+)

Nerede "\ s" uzaya değerlendirilir.

Bu yardımcı olur umarım :)

PHP Kılavuzunda PCRE bölümüne bakın. Ayrıca, http://www.regular-expressions.info/ regex öğrenmek için harika bir site. Yasal Uyarı: Bunu öğrenmek kez Regex çok bağımlılık yapar.

PERL uyumlu ifadeler çok daha fazla yeteneğe sahip, çünkü ben her zaman PHP regex için fonksiyonun preg_ seti kullanın. Bu ekstra yeteneği sağ, mutlaka buraya oyuna gelmiyor, ama onlar da daha hızlı olması gerekiyordu, bu yüzden neden zaten onları kullanmak değil?

Bir ifade için, bu deneyin:

/Seat (\d+): ([^ ]+) \((\d+)/

Bir dizideki sonuçları saklamak, her satırında () preg_match kullanabilirsiniz. Daha sonra bu sonuçlar almak ve bunları istediğiniz gibi işleyebilirsiniz.

EDIT:

Btw, aynı zamanda da, _ maç _ (yerine line-by-line yoluyla ilmekleme) metin tüm blok tüm ve sonuçlar bu şekilde almak gebelik çalıştırabilir.

Bu kodu deneyin. Bu benim için çalışıyor

Dizeleri hatları altında olduğunu varsayalım

$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)";

Dizi ekle

$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)";
}

Check out preg_match. Probably looking for something like...

<?php
$str = 'Seat 1: fabulous29 (835 in chips)';
preg_match('/Seat (?<seatNo>\d+): (?<name>\w+) \((?<chipCnt>\d+) in chips\)/', $str, $matches);
print_r($matches);
?>

It's been a while since I did php, so this *could biraz kapalı ya da çok olabilir. *

İşte şu anda kullanıyorum ne:

preg_match("/(Seat \d+: [A-Za-z0-9 _-]+) \((\d+) in chips\)/",$line)

Bütün giriş dizesi işlemek için bir kerede kullanmak preg_match_all()

preg_match_all('/Seat (\d+): \w+ \((\d+) in chips\)/', $preg_match_all, $matches);

Lütfen giriş dizesi için, $ kibrit var_dump bu gibi görünecektir:

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)

On learning regex: Düzenli ifadeler, 3rd Edition Mastering alın. Eğer gerçekten regex öğrenmek istiyorsanız başka bir şey bu kitapta yakın geliyor. Regex için kesin bir rehber olmasına rağmen, kitap çok acemi dostu olduğunu.

Koltuk [sayı]: [harfler ve sayılar ve karakterler] (cips [sayı])

Sizin Regex bu gibi görünmelidir

(Fiş (\ d +)) ([a-zA-Z0-9] +): Koltuk (\ d +)

Parantez gruplar koltuk numarası, adı ve cips sayıda yakalamak izin verir.

you'll have to split the file by linebreaks, then loop thru each line and apply the following logic

$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>";
  }
}

Bu kod koştu değil, bu nedenle bazı hataları düzeltmek zorunda kalabilirsiniz ...