Wyrażenie regularne

0

Myślę że moje pytanie dla Was będzie proste. Otóż szukam regexa do takiej sytuacji.

Chcę zrobić konwerter do gry ^^

(preg_match('/(Rodzaje wojsk|Dostępne rodzaje):(.*) (Żelazo)/', $text, $unit)

Wszystko jest ok ale ja chcę, żeby ten fragment kody (.*) (Żelazo) pozostawił jakby w domyśle (Żelazo). Aby kończył na tym ale tego nie wyświetlał. Bo nie mogę tego tak zostawić.

Bardzo dziękuję.

2

Spróbuj użyć tzw. positive lookahead. Zamiast (Żelazo) wstaw (?=Żelazo). Wtedy dopasowanie skończy się tuż przed ciągiem Żelazo, natomiast sam ten wyraz nie będzie częścią dopasowania.

0

Może w temacie mam bardzo nurtujące zagadnienie otóż mam tekst np. I jak wyciągnąć z niego te wszystkie dane. Może pomogę.

Tunrida - nicki bohatera = \w{1,7}[\s]?\w{1,7}
322 3 na Księżycowy łuk poziomie
322 - ilość wojsk(1-9999)
3 - poziom wojska(1-10)

Nazwy wojsk :

 $nazwy = array(
        #Elf koszary#
		'Śnieżny wilk',
		'Obrońca',
		'Zwiadowca',
		'Ostrze zmroku',
		'Ostrze pieśni',
		'Mistyczny łucznik',
		#Elf stajnia#
		'Śnieżna pantera',
		'Druid',
		'Księżycowe Ostrze',
		'Księżycowy łuk',
		#Ludzie koszary#
		'Piechur',
		'Pawężnik',
		'Łucznik',
		'Pikinier',
		'Fechmistrz',
		'Strzelec',
		#Ludzie stajnia#
		'Lekka Kawaleria',
		'Ciężka Kawaleria',
		'Lansjer',
		'Łucznik Konny',
        #Orkowie koszary#
		'Orkowy rębacz',
		'Orkowy wojownik',
		'Orkowy kusznik',
		'Orkowy piechur',
		'Orkowy berserker',
		'Orkowy arbaletnik',
		#Orkowie stajnia#
		'Wilczy Jeździec',
		'Elitarny Wilczy Jeździec',
		'Jeździec Wargów',
		'Kusznik Konny'
		);

Ilość bohaterów nielimitowana
Poziom bohatera {1,2} 1-70 poziom
Ilość pozycji z wojskami 6.

Bohater **Tunrida **ma poziom 44 i dowodzi:322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie;

Raport :

Bohater Abigail ma poziom 47 i nie dowodzi żadnymi jednostkami
Bohater Thot Ogt ma poziom 17 i nie dowodzi żadnymi jednostkami
Bohater Tunrida ma poziom 44 i dowodzi:322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie;
Bohater Chloe ma poziom 44 i dowodzi:322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Ostrze zmroku poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie;
Bohater Aust Ogt ma poziom 46 i dowodzi:353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie;

2

Takie coś najwygodniej będzie parsować etapami. Opisy bohaterów są najwidoczniej oddzielone enterami, więc można zastosować zwykły str_split by utworzyć tablicę z opisami bohaterów. Następnie, pętlą foreach można się przez nich przeiterować, w każdej iteracji wywołując funkcję, której zadaniem będzie przetworzenie jednego bohatera.

Czyli jak zwykle w programowaniu: dzielimy duży problem na mniejsze.

Funkcja przetwarzająca bohatera może odpalić jednego regexpa, by podzielić opis bohatera na imię, poziom i "resztę". Ta "reszta", to informacje o tym czym bohater dowodzi. Może tam być "i nie dowodzi żadnymi jednostkami", lub ciąg opisów podrzędnych jednostek. Jednostki są oddzielone przecinkami. Ponownie: można zrobić str_split i każdą jednostkę parsować oddzielnym regexpem, który wyciągnie te 3 (czy 4?) kawałki informacji -- jakieś dwie liczby i poziom.

0

Tylko jak złapać ten cały fragment z bohaterami.

Przykładowy raport. "Tam nie ma enterów"

Szpieg został wysłany do: Canna(121|299). Wyniki: Łączna liczba jednostek: 8007 Bohaterowie: 5 Dostępne rodzaje:Obrońca,Zwiadowca,Ostrze zmroku,Ostrze pieśni,Mistyczny łucznik,Śnieżna pantera,Księżycowy łuk Żelazo:158479 kamień:102894 drewno:70990 żywność:93300 Mury poziomu 22. Wytrzymałość: 660 Wieże strażnicze poziomu 21 Bohater Abigail ma poziom 47 i nie dowodzi żadnymi jednostkami Bohater Thot Ogt ma poziom 17 i nie dowodzi żadnymi jednostkami Bohater Tunrida ma poziom 44 i dowodzi:322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie; Bohater Chloe ma poziom 44 i dowodzi:322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Ostrze zmroku poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie; Bohater Aust Ogt ma poziom 46 i dowodzi:353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie;

0

Jeżeli ktoś może mi pomóc to proszę :( Chciałbym wydobyć każdą informację z raportu. Zwłaszcza jednostki (poziom ilość nazwa) ale nie wiem jak. Nie dam rady sam zrobić. Tyle mi się udało

<html lang="en" xml:lang="en" xmlns="http://www.w3.org/1999/xhtml"><head> 
<meta http-equiv="content-type" content="text/html; charset=windows-1250">
  <style type="text/css">
    body { text-align: center; font: small/1.3 'DejaVu Sans', arial, sans-serif;  }
    #page {
      max-width: 1000px;
      margin: auto;
      text-align: left;
      _width: 1000px;
    }
    textarea { width: 100%; height: 20em; }
  </style>
<?php

  if (isset($_POST['submit'])) {
    if($_POST['text'] != '') {
      $text = $_POST['text'];
      $orig_text = $text;
	  $nazwy = array(
        #Elf koszary#
		'Śnieżny wilk',
		'Obrońca',
		'Zwiadowca',
		'Ostrze zmroku',
		'Ostrze pieśni',
		'Mistyczny łucznik',
		#Elf stajnia#
		'Śnieżna pantera',
		'Druid',
		'Księżycowe Ostrze',
		'Księżycowy łuk',
		#Ludzie koszary#
		'Piechur',
		'Pawężnik',
		'Łucznik',
		'Pikinier',
		'Fechmistrz',
		'Strzelec',
		#Ludzie stajnia#
		'Lekka Kawaleria',
		'Ciężka Kawaleria',
		'Lansjer',
		'Łucznik Konny',
        #Orkowie koszary#
		'Orkowy rębacz',
		'Orkowy wojownik',
		'Orkowy kusznik',
		'Orkowy piechur',
		'Orkowy berserker',
		'Orkowy arbaletnik',
		#Orkowie stajnia#
		'Wilczy Jeździec',
		'Elitarny Wilczy Jeździec',
		'Jeździec Wargów',
		'Kusznik Konny'
		#Zasoby#
		#'drewno',
		#'kamień',
		#'Żelazo',
		#'żywność'
		);
$obrazki = array(
        #Elf koszary#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/1.gif"> Śnieżny wilk',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/2.gif"> Obrońca',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/3.gif"> Zwiadowca',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/4.gif"> Ostrze zmroku',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/5.gif"> Ostrze pieśni ',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/6.gif"> Mistyczny łucznik',
		#Elf stajnia#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/7.gif"> Śnieżna pantera',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/8.gif"> Druid',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/9.gif"> Księżycowe Ostrze',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/3/10.gif"> Księżycowy łuk',
		#Ludzie koszary#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/1.gif"> Piechur',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/2.gif"> Pawężnik',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/3.gif"> Łucznik',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/4.gif"> Pikinier',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/5.gif"> Fechmistrz',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/6.gif"> Strzelec',
		#Ludzie stajnia#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/7.gif"> Lekka Kawaleria',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/8.gif"> Ciężka Kawaleria',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/9.gif"> Lansjer',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/1/10.gif"> Łucznik Konny',
        #Orkowie koszary#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/1.gif"> Orkowy rębacz',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/2.gif"> Orkowy wojownik',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/3.gif"> Orkowy kusznik',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/4.gif"> Orkowy piechur',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/5.gif"> Orkowy berserker',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/6.gif"> Orkowy arbaletnik',
		#Orkowie stajnia#
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/7.gif"> Wilczy Jeździec',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/8.gif"> Elitarny Wilczy Jeździec',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/9.gif"> Jeździec Wargów',
		'<img width="18" height="18" src="http://s1.empcraft.pl/images/soldier/2/10.gif"> Kusznik Konny'
	    #Zasoby#
		#'<img width="18" height="18" src="http://s1.empcraft.pl/images/ico_res_1.gif"> drew',
		#'<img width="18" height="18" src="http://s1.empcraft.pl/images/ico_res_2.gif"> kamień',
		#'<img width="18" height="18" src="http://s1.empcraft.pl/images/ico_res_3.gif"> Żelazo',
		#'<img width="18" height="18" src="http://s1.empcraft.pl/images/ico_res_4.gif"> żywność'
		);
		$text = str_replace($nazwy, $obrazki, $text); 
	  if (preg_match('/\w{1,6}\([0-9]{3}\|[0-9]{3}\)/', $text, $target)) {
    $info = "Znaleziono cel";
} else {
    echo "A match was not found.";
}

if (preg_match('/Żelazo:\w{1,11}/', $text, $zelazo)) {
    $info = "Znaleziono ilosc zelaza";
} else {
    echo "A match was not found.";
}

if (preg_match('/Kamień:\w{1,11}/i', $text, $kamien)) {
    $info = "Znaleziono ilosc kamienia";
} else {
    echo "A match was not found.";
}

if (preg_match('/drewno:\w{1,11}/i', $text, $drewno)) {
    $info = "Znaleziono ilosc drewna";
} else {
    echo "A match was not found.";
}

if (preg_match('/żywność:\w{1,11}/i', $text, $zywnosc)) {
    $info = "Znaleziono ilosc zywnosci";
} else {
    echo "A match was not found.";
}

if (preg_match('/Bohaterowie:(\s)?\d{1,3}/', $text, $bohater)) {
    $info = "Znaleziono ilosc bohaterow w miescie";
} else {
    echo "A match was not found.";
}

if (preg_match('/Mury poziomu(\s)?\d{1,2}/', $text, $mury)) {
    $info = "Znaleziono mury";
} else {
    echo "A match was not found.";
}

if (preg_match('/Wytrzymałość:\s\d{1,5}/', $text, $hpmuru)) {
    $info = "Znaleziono wytrzymalosc muru";
} else {
    echo "A match was not found.";
}

if (preg_match('/Wieże strażnicze poziomu(\s)?\d{1,2}/', $text, $wieze)) {
    $info = "Znaleziono wieze";
} else {
    echo "A match was not found.";
}
#Bohater Emma ma/jest poziom/poziomu 0-99#
if (preg_match_all('/Bohater \w{1,7}[\s]?\w{1,7} (ma poziom|jest poziomu) \d{2}/', $text, $lista)) {
    $info = "Znaleziono liste bohaterow";
} else {
    echo "A match was not found.";
}

if (preg_match('/Łączna liczba jednostek:(\s\w{1,20}(\s\w{1,20})?|(\d{5})?)/', $text, $liczba)) {
    $info = "Znaleziono ilosc jednostek";
} else {
    echo "A match was not found.";
}

if (preg_match('/(Rodzaje wojsk|Dostępne rodzaje):(.*) (?=Żelazo)/', $text, $unit)) {
} else {
}
foreach(explode(',', $unit) as $item) {
echo trim($item);
} 



}

    }
	

?>

<body>

<div id="page">
  <h2>Raport Konwert</h2>

  Wklej np
  <?PHP
  
  echo '<br><br>
Polska(112|279): miejsce to okazało się dobrze chronione i twoi szpiedzy zdążyli przekazać wyłącznie podstawowe informacje, zanim zostali schwytani.
Oto ich raport:
Łączna liczba jednostek: Niepowstrzymana armia
Bohaterowie: 1
Rodzaje wojsk:Śnieżny wilk,Zwiadowca,Ostrze pieśni,Mistyczny łucznik,Druid
Żelazo:9968 kamień:16725 drewno:25673 żywność:85555
Mury poziomu 20. Wytrzymałość: 600
Wieże strażnicze poziomu 20
Bohater Gerald jest poziomu 36
Bohater Arst jest poziomu 11
Bohater Ax1 jest poziomu 77?';

  echo '<br><br>
Szpieg został wysłany do: Canna(121|299). Wyniki:
Łączna liczba jednostek: 8007
Bohaterowie: 5
Dostępne rodzaje:Obrońca,Zwiadowca,Ostrze zmroku,Ostrze pieśni,Mistyczny łucznik,Śnieżna pantera,Księżycowy łuk
Żelazo:158479 kamień:102894 drewno:70990 żywność:93300
Mury poziomu 22. Wytrzymałość: 660
Wieże strażnicze poziomu 21
Bohater Abigail ma poziom 47 i nie dowodzi żadnymi jednostkami
Bohater Thot Ogt ma poziom 17 i nie dowodzi żadnymi jednostkami
Bohater Tunrida ma poziom 44 i dowodzi:322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie;
Bohater Chloe ma poziom 44 i dowodzi:322 3 na Mistyczny łucznik poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Ostrze zmroku poziomie,322 3 na Księżycowy łuk poziomie,322 3 na Mistyczny łucznik poziomie;
Bohater Aust Ogt ma poziom 46 i dowodzi:353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie,353 3 na Księżycowy łuk poziomie,353 3 na Mistyczny łucznik poziomie;';
?>


  <p>Dane wejściowe:</p>
  <form method="post" action="<?php echo($PHP_SELF); ?>">
    <p>
      <textarea name="text"><?php print $orig_text; ?></textarea>
    </p>
    <p>
      <input type="radio" id="Kon" name="Kon" value="Kon" checked="checked" />
      <label for="Kon">Kon</label>
    </p>

    <p>
      <input type="submit" name="submit" value="Konwertuj" />
      <input type="reset" value="Wyczyść" />
    </p>
  </form>

  <hr />

  <?php
    if (!empty($text)) {
      echo "<h3>Wynik HTML copy:</h3>";
      echo '<textarea name="text"><center>Szpiegowane miejsce to : '.$target[0].'<br>
     '.$zelazo[0].'<br>
	 '.$kamien[0].'<br>
	 '.$drewno[0].'<br>
	 '.$zywnosc[0].'<br>
	 '.$bohater[0].'<br>
	 '.$mury[0].'<br>
	 '.$wieze[0].'<br>
	 '.$liczba[0].'<br>
	 '.$hpmuru[0].'<br>
	 '.$unit[0].'<br>
    ';
	 
	foreach ($lista[0] as $val) {
    echo $val . '<br>';
    }
	echo '</textarea>';
	      echo "<h3>Wynik HTML:</h3>";
      echo '<center>Szpiegowane miejsce to : '.$target[0].'<br>
     '.$zelazo[0].'<br>
	 '.$kamien[0].'<br>
	 '.$drewno[0].'<br>
	 '.$zywnosc[0].'<br>
	 '.$bohater[0].'<br>
	 '.$mury[0].'<br>
	 '.$wieze[0].'<br>
	 '.$liczba[0].'<br>
	 '.$hpmuru[0].'<br>
	 '.$unit1[0].'<br>
	 '.$unit[0].'<br>
    ';
	 
	foreach ($lista[0] as $val) {
    echo $val . '<br>';
    }
    }
    elseif (!empty($_POST)) {
      echo 'Musisz podać jakieś dane';
    }

  ?>

</div>

</body>
</html>

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.