[PHP] Specifieke tekst uit samengestelde string filteren

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • The Specialist
  • Registratie: Augustus 2001
  • Laatst online: 19-06 21:36
Voor wat projecten ben ik de laatste tijd veel bezig met PHP scripting. Er is echter een ding waar ik niet een uit kom. Momenteel moet ik enkele variabelen uitlezen van een dedicated gameserver en die uiteindelijke presenteren op een webpagina.

Nu moet ik uit een lange string een specifiek stuk text filteren, de naam van een gameserver

Gegeven is de string:
code:
1
2
3
$string = '"hostname" = "Testserver @ Gameserver x346" ( def. "" ) - 
Hostname for server. L 12/30/2009 - 04:33:30: rcon from "192.168.0.100:53175": 
command "hostname"';


Wat ik eruit wil filteren is het gedeelte wat de inhoud van de variabele "hostname" weergeeft, namelijk "Testserver @ Gameserver x346".

Ik heb allerlei dingen geprobeerd zoals
code:
1
preg_match ('/\"(.*)\"/',$string,$match);
Resultaat: alle data tussen de twee buitenste quotjes van $string wordt geparsed, maar niet dat wat ik wil.

code:
1
preg_match ('/(\".*?\")/', $string, $match);
Resultaat: parsed enkel "hostname", meer niet (logisch vanwege .*?)

code:
1
preg_match ('/\"([^"\n\q]*)\"/', $string, $match);
Resultaat: same as before

Nu heb ik nog een legio (25+) mogelijkheden geprobeerd, maar ik blijf maar "hostname" of alsnog bijna de hele string door geparsed krijgen in plaats van enkel "Testserver @ Gameserver x346".

Kunnen jullie mij wat op weg helpen?

Programming is like sex, one mistake, and you have to support it for life
my software never has bugs....it just develops random features


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

PHP:
1
2
preg_match_all('/"[^"]+" = "([^"]+?)"/', $string, $matches);
print_r($matches);

Of zeg ik nou iets geks?

Nog los van het feit dat je hier geen regular expressions nodig hebt; het is immers altijd de tekst tussen de derde en vierde quote. ;)

[ Voor 38% gewijzigd door NMe op 30-12-2009 05:42 ]

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.


Acties:
  • 0 Henk 'm!

  • HuHu
  • Registratie: Maart 2005
  • Niet online
Maak een substring die loopt vanaf de " voor Testserver, door gewoon het aantal tekens te tellen. Zoek dan de positie van de eerste " in die substring en kap hem daar af. Dan heb je de tekst Testserver @ Gameserver x346 te pakken.

Acties:
  • 0 Henk 'm!

Verwijderd

$s2 = split('"", $string);
$watjenodighebt = $s2[2];

Lelijk, maar werkt prima.

[ Voor 21% gewijzigd door Verwijderd op 30-12-2009 10:51 ]


Acties:
  • 0 Henk 'm!

  • DeoDupke
  • Registratie: Maart 2002
  • Laatst online: 26-03-2024
ik zou het met de volgende regex gedaan hebben:
code:
1
/"hostname" = "(.*?)"/


maar vraag me af of de aanpak van NMe beter is? Geeft mijn aanpak ergens problemen? Is hij langzamer? (dit omdat ik een aantal scripts heb met ongeveer hetzelfde doel)

No worries m8


Acties:
  • 0 Henk 'm!

  • CodeCaster
  • Registratie: Juni 2003
  • Niet online

CodeCaster

Can I get uhm...

DeoDupke schreef op woensdag 30 december 2009 @ 10:52:
ik zou het met de volgende regex gedaan hebben:
code:
1
/"hostname" = "(.*?)"/


maar vraag me af of de aanpak van NMe beter is? Geeft mijn aanpak ergens problemen? Is hij langzamer? (dit omdat ik een aantal scripts heb met ongeveer hetzelfde doel)
Dan is dit je hostname:
code:
1
Testserver @ Gameserver x346" ( def. "

Ik zou het in dat geval ungreedy doen. Maar ik zou in deze situatie sowieso geen regular expression gebruiken, maar de eerder aangedragen oplossingen.

@Cheatah: je hebt gelijk.

[ Voor 9% gewijzigd door CodeCaster op 30-12-2009 11:42 ]

https://oneerlijkewoz.nl
Op papier is hij aan het tekenen, maar in de praktijk...


Acties:
  • 0 Henk 'm!

Verwijderd

CodeCaster schreef op woensdag 30 december 2009 @ 10:54:

Ik zou het in dat geval ungreedy doen.
.*? is ungreedy. Wat je zegt klopt dus niet.
Maar ik zou in deze situatie sowieso geen regular expression gebruiken, maar de eerder aangedragen oplossingen.
Ik zou wel een regular expression gebruiken. Maar niet als ik er geen ervaring mee zou hebben.

Acties:
  • 0 Henk 'm!

  • DeoDupke
  • Registratie: Maart 2002
  • Laatst online: 26-03-2024
Hier in perl geeft hij toch echt gewoon: Testserver @ Gameserver x346

No worries m8


Acties:
  • 0 Henk 'm!

  • Peter
  • Registratie: Januari 2005
  • Laatst online: 13-09 17:10
Verwijderd schreef op woensdag 30 december 2009 @ 10:51:
$s2 = split('"", $string);
$watjenodighebt = $s2\[2];

Lelijk, maar werkt prima.
Behalve dat split deprecated is en het gebruik ervan afgeraden wordt is dit inderdaad wel heel vies. Via een regular expression kan je dit prima oplossen, zoals anderen ook al aangeven.

Die manier van NMe werkt prima hier, zowel op PHP 5.2.12 als 5.3.1.

Acties:
  • 0 Henk 'm!

  • The Specialist
  • Registratie: Augustus 2001
  • Laatst online: 19-06 21:36
Werkt als een tierelier NMe, bedankt voor de snelle replies!

@DeoDupke: ik merk geen tijdsverschil in de uitvoer van de code, maar zelf vindt ik de code van NMe wat netter en ben dus daarvoor gegaan. Wellicht als je heel erg veel van die instructies uit moet voeren, dat tijd dan een rol gaat spelen, maar in de kleine oplage zoals bij mij niet.

Programming is like sex, one mistake, and you have to support it for life
my software never has bugs....it just develops random features


Acties:
  • 0 Henk 'm!

  • NMe
  • Registratie: Februari 2004
  • Laatst online: 09-09 13:58

NMe

Quia Ego Sic Dico.

The Specialist schreef op woensdag 30 december 2009 @ 13:21:
Werkt als een tierelier NMe, bedankt voor de snelle replies!

@DeoDupke: ik merk geen tijdsverschil in de uitvoer van de code, maar zelf vindt ik de code van NMe wat netter en ben dus daarvoor gegaan. Wellicht als je heel erg veel van die instructies uit moet voeren, dat tijd dan een rol gaat spelen, maar in de kleine oplage zoals bij mij niet.
Ik ben in mijn regular expression er vanuit gegaan dat je meerdere soorten strings op die manier wil kunnen matchen, niet alleen hostnames. Als je altijd alleen maar hostnames opzoekt met deze regular expression is de manier van DeoDupke leesbaarder en in theorie ook sneller, en dus zou ik eerder voor die oplossing kiezen. :)

'E's fighting in there!' he stuttered, grabbing the captain's arm.
'All by himself?' said the captain.
'No, with everyone!' shouted Nobby, hopping from one foot to the other.

Pagina: 1