Portál AbcLinuxu, 14. května 2025 00:57

Dotaz: PHP parse text

7.7.2020 13:47 Martin
PHP parse text
Přečteno: 542×
Odpovědět | Admin
Ahoj,

mam nieco taketo. Je to vystup hodnot senzorov nejakeho zariadenia, ktory ziskavam externym prikazom. A potreboval by som s toho co najjednoduchsie v PHPcku dostat tie hodnoty. Cize napr. [14]: 215.600006 s toho potrebujem dostat 215.600006 a ulozit. Dakujem.
[14]: 215.600006
[16]: 0.000000
[18]: 0.000000
[20]: 50.029999
[22]: 5.030000
[24]: 0.000000

Řešení dotazu:


Nástroje: Začni sledovat (0) ?Zašle upozornění na váš email při vložení nového komentáře.

Odpovědi

7.7.2020 14:02 _
Rozbalit Rozbalit vše Re: PHP parse text
Odpovědět | | Sbalit | Link | Blokovat | Admin
Kolik těch hodnot je a jak moc ti záleží na rychlosti zpracování?

Regexpy neumím a někdo určitě vymyslí lepší, ale tohle asi bude fungovat: [:]\s(.+)$ (má to zachytit cokoliv odkonce za dvoutečkou s mezerou)

Použij preg_match_all
7.7.2020 14:13 Martin
Rozbalit Rozbalit vše Re: PHP parse text
Hodnot je asi cca 50 takze predpokladam, ze rychlost spracovania asi bude v pohode
7.7.2020 14:16 _
Rozbalit Rozbalit vše Re: PHP parse text
Tak to si můžeš vybrat cokoliv, regex se lépe udržuje a testuje, ale zase na debilanovym způsobu se nedá nic moc zkazit.
Gréta avatar 7.7.2020 17:17 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP parse text

vopravenější verze ;D

<?php

//$re = '/[:]\s(.+)$/m';
/*
podtžítkův regex vracel zdovjeně dělala to tamta chytací skupina (.+)
nóó takže z toho padalo takovýdle zdvojený pole v jedny půlce s dvojtečkou navíc :O ;D
array(6) 
{ 
[0]=> array(2) { [0]=> string(12) ": 215.600006" [1]=> string(10) "215.600006" } 
[1]=> array(2) { [0]=> string(10) ": 0.000000" [1]=> string(8) "0.000000" }
[2]=> array(2) { [0]=> string(10) ": 0.000000" [1]=> string(8) "0.000000" }
[3]=> array(2) { [0]=> string(11) ": 50.029999" [1]=> string(9) "50.029999" }
[4]=> array(2) { [0]=> string(10) ": 5.030000" [1]=> string(8) "5.030000" }
[5]=> array(2) { [0]=> string(10) ": 0.000000" [1]=> string(8) "0.000000" } 
}
*/

/* novej regexp co dělá že vezme všecky znaky vod pomlčky až ke konci řádku
tamto ?<= je lookbehind https://www.regextutorial.org/positive-and-negative-lookbehind-assertions.php
prostě jako vezmem všecko čemu předcházel znáček dvojtečky noa z toho vemem pomocí .* všecky znaky až ke značce konce stringu jakože $
tamto 'm' nakonci řiká žetoje jakoby multiline že pracuje s víc řádkovým vstupem. noa kdybys nechtěl pracovat s víc řádkama 
najednou ale strkal totam třeba pojednom stringu by ti jako měl stačit takovejdle regexp '/(?<=\:).*$/' bez toho m nakonci :O ;D
*/
$re='/(?<=\:).*$/m';

//vstupní string
$str = '[14]: 215.600006

[16]: 0.000000

[18]: 0.000000

[20]: 50.029999

[22]: 5.030000

[24]: 0.000000';

//nacpem chycený do pole $matches
preg_match_all($re, $str, $matches);

// a vypišem
var_dump($matches);

?>

7.7.2020 17:26 _
Rozbalit Rozbalit vše Re: PHP parse text
Najs, musím se ty regexpy pořádně naučit, škoda že je v práci ani v hobby projektech nevyužiju. Měl jsem radost že jsem to vůbec nějak upatlal :-D
Gréta avatar 8.7.2020 21:27 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP parse text

hehe taky je furt googlim :D ;D supr jeto webový ide regex101 cos už vodkazoval v prvním komentu hele ;D

Řešení 1× (Bherzet)
7.7.2020 14:05 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP parse text
Odpovědět | | Sbalit | Link | Blokovat | Admin
Vyber a upravuj co a ako chces:
<?php

// ak je hodnota v [] vzdy na 2 miesta, tak
function zistenie($line)
{
	return substr($line, 6);
}

function zistenie2($line)
{
	return substr($line, strpos($line, ' ')+1);
}

function zistenie3($line)
{
	$tails=explode(' ', $line);
	return $tails[1];
}

echo zistenie("[14]: 215.600006")."\n";
echo zistenie2("[14]: 215.600006")."\n";
echo zistenie3("[14]: 215.600006")."\n";
debian.plus@protonmail.com
7.7.2020 16:46 Bherzet | skóre: 19 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: PHP parse text
Ten druhý způsob vypadá nejlíp, ale chtělo by to vědět, jestli se mezera nemůže objevit i na dřívější pozici v tom řádku (třeba kvůli nějakému paddingu). Možná by bylo lepší brát místo první mezery poslední, protože na konci řádku mezery snad nebudou…
Jendа avatar 7.7.2020 17:30 Jendа | skóre: 78 | blog: Jenda | JO70FB
Rozbalit Rozbalit vše Re: PHP parse text
V Pythonu bych na to preventivně volal strip, ekvivalent v PHP si bude muset vygooglit.
7.7.2020 18:23 Bherzet | skóre: 19 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: PHP parse text
Jako to taky, ale měl jsem spíš na mysli věci jako [ 12]: 1.23 nebo [12]:   1.23. Ale strip pomůže při tom matchování od konce řádku, protože pokud tam budou někde mezery, tak nejspíš za posledním nebílým znakem.
Řešení 1× (Bherzet)
7.7.2020 20:22 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP parse text
Najskor je to je uz piplanie na jeho pomery. Kedze snimac posiela v jednom jednoduchsom formate a nebude si to zbytocne komplikovat. Ine by to bolo napr. parsovanie webov alebo riadkovy vstup od uzivatala.
function zistenie2($line)
{
	$line=str_replace(' ', '', $line);
    return substr($line, strpos($line, ':')+1);
}
Ak chces ultra prisne, tak si napis vlastny parser.
debian.plus@protonmail.com
7.7.2020 22:42 Bherzet | skóre: 19 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: PHP parse text
To neber jako kritiku, už ten tvůj první komentář jsem označil jako řešení. Zadání nepopisuje celou gramatiku vstupu, takže si můžeme jen domýšlet, jaké stavy tam mohou nastat. Že by tam mohl být nějaký problém s mezerami mi přišlo celkem reálné, tak proto jsem to doplnil.

Tohle řešení mi přijde asi nejrobustnější.
Gréta avatar 8.7.2020 21:09 Gréta | skóre: 37 | blog: Grétin blogísek | 🇮🇱==❤️ , 🇵🇸==💩 , 🇪🇺==☭
Rozbalit Rozbalit vše Re: PHP parse text

víc bezpečnější než replace by měl jakoby bejt trim hele protože né všecky bílý znáčky mužou bejt právě vobyč mezery. jestli se teda jako ještě muže řikat bílej znak :O ;D

si myslim že von dál nebude pracovat s těma hodnotama jako se stringama nóó takže by taky jako bylo dobrý udělat cast na float hele ;D

8.7.2020 23:31 Bherzet | skóre: 19 | blog: Bherzetův blog
Rozbalit Rozbalit vše Re: PHP parse text
jestli se teda jako ještě muže řikat bílej znak :O ;D
Odstraňovat bílé znaky je v pořádku, ovšem až se proflákne, že před sedmnácti lety v Anglii na jedné veřejné univerzitě vytvořili jazyk, který nepřipouští naprosto vůbec žádné černé znaky, bude z toho mezinárodní skandál.
7.7.2020 17:37 z_sk | skóre: 34 | blog: analyzy
Rozbalit Rozbalit vše Re: PHP parse text
Ziaden problem. Dokonca je to tym padom lepsie:
function zistenie2($line)
{
	return substr($line, strrpos($line, ' ')+1);
}
debian.plus@protonmail.com

Založit nové vláknoNahoru

Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

ISSN 1214-1267, (c) 1999-2007 Stickfish s.r.o.