Portál AbcLinuxu, 11. května 2025 10:27

Dotaz: php eregi_replace

19.2.2009 17:52 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
php eregi_replace
Přečteno: 486×
Odpovědět | Admin

Jak v PHPku v eregi_replace, nebo jiné funkci pro regulérní výrazy zadám, že má nahrazovat pouze pokud je sudý počet určitých znaků.

Konkrétně potřebuju pracovat s textem, který je rozdělen do řádků a řádky do elementů pomocí znaku ; Jenomže jak znak konce řádků, tak ; může být součástí textu a to že to tak není se pozná podle toho jestli je před \r\n a ; nula, nebo sudý počet \.

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

Odpovědi

19.2.2009 19:56 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
Odpovědět | | Sbalit | Link | Blokovat | Admin
Něco jako \(..\)* nestačí?
19.2.2009 19:58 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
Bez těch lomítek.
21.2.2009 11:44 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: php eregi_replace

Bez jakých lomítek?

Mám takový textový soubor:

toto ma byt na jedne \
radce
a toto taky \\
toto má být na další řádce
Zkoušel jsem vymyslet něco takového:
<?php
$h=fopen("text.txt","r");
$text=fread($h,filesize("text.txt"));
fclose($h);

$pole=spliti("((\\\\\\\\)*\n)",$text);
array_pop($pole);
print_r($pole);
echo "<hr>";
$pole=preg_split("/(\\\\\\\\)*\n/",$text);
array_pop($pole);
print_r($pole);
?>
Jenomže obojí mi text vypíše jako
Array ( [0] => toto ma byt na jedne \ [1] => radce [2] => a toto taky [3] => toto ma byt na dalsi radce  ) 
Array ( [0] => toto ma byt na jedne \ [1] => radce [2] => a toto taky [3] => toto ma byt na dalsi radce ) 
Místo:
Array ( [0] => toto ma byt na jedne \ radce [1] => a toto taky [2] => toto ma byt na dalsi radce ) 
Array ( [0] => toto ma byt na jedne \ radce [1] => a toto taky [2] => toto ma byt na dalsi radce ) 
Kde dělám chybu? Proč mi to rozdělí ten text po tom lomítku v [0]? Předem děkuji za vaše odpovědi.
21.2.2009 14:55 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
Lomítko je výraz pro slash, čili tento znak: ---> \, zde se jedná o backslash, čili zpětné lomítko.

Takže oprava mého komentáře

Něco jako \(..\)* nestačí?

po aplikaci "bez těch lomítek"

vychází takto:

Něco jako (..)* nestačí?

Zjevně to nestačí, na popsání výrazu skoro ano, ale problém funkce split je, že popsaný výraz z výsledku vykousne, což je problém u výrazu kde je 0 lomítek. 2, 4, 6 lomítek popíšete (\\\\\\\\)+\n, nula lomítek zase [^\\\\]\n, ale to vám sežere to jedno písmeno (nelomítko) před koncem řádku.

Takže výraz jako jako ([^\\\\]|(\\\\\\\\)+\n nebo [^\\](\\\\\\\\)*\n což je zhruba totéž funguje, problém je že tímto se sice popíše daný řetězec, ale někdy ještě jeden znak před tím koncem řádku bez lomítka. Řešení zatím nevidím, je to asi mimo rámec těchto regulárních výrazů (je to problém že chcete popsat kontext ale necete ten kontext vykousnout).
21.2.2009 14:57 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
opr.: ([^\\\\]|(\\\\\\\\)+)\n
21.2.2009 15:00 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
Bude to chtít projet ten vstupní řetězec a zkonsolidovat ho, třeba \n kterému nepředchází žádné lomítko nahradit dvěma lomítky a \n, tedy \\\n. Že by to přecejen nějak šlo jen tou fcí split se mi nezdá.
23.2.2009 13:48 YYY | skóre: 29 | blog: martinek
Rozbalit Rozbalit vše Re: php eregi_replace
Odpovědět | | Sbalit | Link | Blokovat | Admin
Pouzij explode a mas to na par radek.
23.2.2009 14:00 filbar | skóre: 36 | blog: Denicek_programatora | Ostrava
Rozbalit Rozbalit vše Re: php eregi_replace
A explode umí regulární výrazy?
23.2.2009 17:58 Ash | skóre: 53
Rozbalit Rozbalit vše Re: php eregi_replace
Však to dělá, vizte diskuzi. Přesněji používá split/preg_split kvůli regexp/pcregexp. Na pár řádek to zatím nevypadá, spíš na dvouprůchodové řešení :)

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.