Autor Zpráva
medden
Profil *
Zdravím,
píšem si vlastný template systém a v ňom používam značky uzavreté do []
Problém je ale v tom, že v template sa môže vyskytnúť aj php kód, v ktorom tiež môže byť [] (napríklad prístup k poliam). Template značky získavam cez jednoduché preg_match_all s regulárom ~[(.*)]~Us ale ako ho upraviť, aby ignoroval všetko čo je php? (teda medzi <?php a ?>). Skúšal som lookbehind asercie (niečo ako (?<!<?php.*) a podobne, ale tam musím mať nastavenú konštantnú dĺžku (Compilation failed: lookbehind assertion is not fixed length )
pavel prochazka.zde.cz
Profil *
function Odstranit_HTML_Znacky($sString)
{
// tato funkce odstrani HTML a PHP znacky, vcetne kodu. zustane jen prosty text...
global $mazat;
$nPrizna1 = false;
$sString = Trim($sString);
$nPozice = StrPos($sString, "<?php");
if ($nPozice === false){
$nPozice = StrPos($sString, "<?");
}
if ($nPozice !== false ) {
$mazat = true;
$nPoziceX = StrPos($sString, "?>");
if ($nPoziceX !== false ) {
$sString = substr_replace($sString, '', $nPozice, ($nPoziceX - $nPozice) + 2);
$mazat = false;
}
else{
$sString = SubStr($sString, 0, $nPozice);
}
if ($sString !== false)$nPrizna1 = true ;
}
$nPozice = StrPos($sString, "?>");
if ($nPozice !== false) {
$mazat = false;
$sString = SubStr($sString, $nPozice + 2);
$nPrizna1 = false;
}
if ($mazat == false or $nPrizna1 == true) {
$sNewString = Strip_Tags($sString);
$sNewString = Str_Replace("&nbsp;", "", $sNewString);
} else $sNewString = "";
return $sNewString;
}

Tato funkce vyzaduje posilani filtrovane stranky po radkach!!!!
pavel prochazka.zde.cz
Profil *
Jak funkce pracuje si muzes vyzkouset na vyhledavacim scriptu meho webu :). Kde je v sekci i php kod vyhledavaciho scriptu...
one_k
Profil
pavel prochazka.zde.cz
aaa no fuj..

je dobre pouzit pro zapis templatovacich znacek znaky, ktere budou snadno odlisitelne od kodu.
napr. pocitat i s case-sensitivitou

priklad z HTML_TMPL:
<TMPL_VAR NAME="promenna">

proste jednoznacne identifikovatelne. Jde preci i o rychlost toho systemu,nebo ne? Uz jen to ze ho pises v php ho dost zpomaluje oproti perlovym templatovacim systemum.
Takze zadne slozitosti:)
pavel prochazka.zde.cz
Profil *
one_k

hmm, pekne
ale kdyz jsem se ptal jak s dala vyhledavaci script pro web, tak me nikdo nepomohl :(, jen odkazaly na sluzku bud placenou a nebo free (google) ktera je uplne k nicemu....
Tak jsem si napsal svoje reseni a faka spolehlive...
pavel prochazka.zde.cz
Profil *
one_k
Stou konstantou uzavrenou ve znaku <> je to fakt super napad....:). To me nenapadlo a kod bude pro vycisteni fakt uplne primitivni :). Mozna to nekdy predelam az bude cas....
medden
Profil *
pavel prochazka.zde.cz
Ďakujem za funkciu a snahu, ale to nie je to čo som chcel... :-) Skús si ešte raz prečítať môj dotaz, ty si písal o niečom úplne inom.
one_k detto

Skúsim radšej príklad:

$priklad = '
<html>
[foo]
<?php
print $kdesicosi["abc"];
?>
[bar]
</html>';

preg_match_all('~[(.*)]~Us', $priklad, $out, PREG_SET_ORDER);
print_r($out);
?>


Teraz je výsledok

Array
(
[0] => Array
(
[0] => [foo]
[1] => foo
)

[1] => Array
(
[0] => ["abc"]
[1] => "abc"
)

[2] => Array
(
[0] => [bar]
[1] => bar
)

)


Ja sa toho ["abc"] chcem zbaviť. Dúfam, že je to teraz zrozumiteľné, hádam tu ešte niekto vie po slovensky :)
tiso
Profil
medden - stačí keď v regulárnom výraze vylúčiš použitie úvodzoviek vo vnútri [], ale spoľahlivé to nebude (môžeš zabudnúť napísať úvodzovky v PHP, alebo použiješ konštantu ktorá sa v úvodzovkách nepíše)
Chalani Ti tu naznačovali aby si nevymýšľal koleso ale použil už vymyslené...
pavel prochazka.zde.cz
Profil *
medden
aha aha, ja jsem to z toho popisu fakt pochopil tak jak jsem prezentoval. Ale to nevadi. Staci moji funkci jen upravit, misto aby mazala dany retezec, muze prohledavat v tomto useku uvozovky a zacit mazat az zatema uvozovkama dokun nenarazi na dalsi uvozovky pro ukonceni, A to jen v rezii PHP kodu :).
medden
Profil *
Radšej vám to napíšem ešte raz:
Chcem získať všetko čo je medzi [ a ] a nie je to v php kóde.

stačí keď v regulárnom výraze vylúčiš použitie úvodzoviek vo vnútri [], ale spoľahlivé to nebude (môžeš zabudnúť napísať úvodzovky v PHP, alebo použiješ konštantu ktorá sa v úvodzovkách nepíše)
Presne o to ide, keby si chcel, tak ti napíšem aj 10 príkladov kedy to nepôjde. To znamená, že vylúčenie podľa úvodzoviek a podobne nepripadá do úvahy, keď to ide univerzálnejšie (tj vylúčiť všetko čo je vnútri php kódu).
Ssob
Profil
nemuzes si ty znacky pojmenovat jinak? Napr. zacinala by [- a koncila -].
medden
Profil *
Ssob
Nemôžem, lebo je to škaredé obchádzanie problému, a potom to už nie je univerzálne.

Na jedno riešenie som prišiel, je celkom zaujímavé, ale zaujímalo by ma či ešte na niečo prídete.
YoSarin
Profil
medden
Co projíždět ten soubor pěkně znak po znaku a chytat všechny [ a ] - tak aby byly párové. Jakmile v kódu narazíš na posloupnost <?php nebo <? tak vypnout odchytávání těch [] do doby než najedeš na ?>.
Není to uplně vychytaný - musíš si dávat pozor na víc věcí než jen <?php ?> (třeba i na stringy).
medden
Profil *
YoSarin
Pekne si vystihol môj myšlienkový postup ;-) To najlepšie, čo som zatiaľ našiel bolo toto:

Prejdem celý súbor cez funkciu token_get_all
ak to nie je html (tzn nie je to T_INLINE_HTML)
je to teda php kód, pridam ho do vysledkov na vratenies
inak je to teda html kód, ktorý môže obsahovať template značky, tak si ho parsujem (cez už spomenuté preg_match_all('~[(.+)]~', $token, $tag)) a to ďalej spracovávam.


token_get_all je jedna funkcia, ktorá mi už veľa krát pomohla, odporúčam si ju naštudovať. Vďaka nej odpadajú tie ďalšie problémy, na ktoré si treba dať pozor (" a ' stringy, heredoc syntax, inline a blokové komentáre, ... je toho dosť)
YoSarin
Profil
medden
YoSarin
Pekne si vystihol môj myšlienkový postup ;-)

Používám to pro zvýrazňování syntaxe ;)
Toto téma je uzamčeno. Odpověď nelze zaslat.