Zkratka na hlavní stranu: Alt + Shift + horní 2(ě)
Linkedin FB e-mail Google Plus Twitter

Hledat na tomto webu

 

PHP - Náhrada funkce explode - skript s více oddělovači slov současně
Rozdělení věty na slova; kontrola, oprava a cenzura oddělených slov; znovusestavení věty

 

Vytvořeno
23.3.2012

 

Potřeboval jsem se v PHP dostat na jednotlivá slova textového řetězce (rozdělit string na array), ale nestačilo mi větu na slova dělit jen podle mezer, jak se to obvykle s použitím funkce explode dělá, chtěl jsem definovat a použít pole více oddělovačů slov.

Abych izoloval i slova ukončená tečkou, čárkou, závorkou, vykřičníkem, apod.
Protože při postupném použití funkce explode s různými znaky by nebyla oddělena slova, která mají zleva jiný znak než zprava …což je častý případ – za slovem je čárka nebo tečka, ale před slovem je mezera – málokdy je ve větě slovo obklopené tečkami z obou stran, a když už tam je, tak je to stejně typografická chyba. Nemluvě o tom, že bychom pak měli pole polí (i když to se dá vyřešit spojením).

Nic hotového jsem nenašel, tak jsem si ten skript (alternativa k funkci explode) napsal a dávám ho dál…

Protože narozdíl od běžného postupu, kdy se funkcí explode rozdělí řetězec jen tam, kde je mezera
(a kde tedy při pozdějším slepování zpět víme, že mezi jednotlivá slova přijde vždy mezera),
jsem potřeboval uchovat i jednotlivé znaky mezi slovy, abych řetězec nepoškodil,
ukládám si ty oddělovače jako samostatná slova v poli.Pro moje použití to ničemu nevadilo.
Pokud by to vadilo vám, můžete si nalezené oddělovače ukládat do samostatného pole, nebo třeba zahazovat.
Pokud ale potřebujete větu na závěr zase slepit dohromady, komplikovalo by vám uložení oddělovačů v samostatném poli práci – takže je lepší nechat slova i oddělovače takto sypat do jednoho společného pole
– a pokud potřebujete zasahovat jen do slov, ne do oddělovačů, můžete si při procházení pole kontrolovat lichost/sudost (dělitelnost dvěma) pořadí každého prvku v poli.

Sice existují různé alternativy k funkci explode, a to třeba i pro více oddělovačů, ale tento můj skript narozdíl od jiných řešení (alespoň těch, která jsem našel) zachová informaci o původních oddělovačích.
Je tedy určen pro rozebrání věty na slova, kontrolu/opravu/cenzuru jednotlivých slov a opětovné slepení věty se zachováním původních oddělovačů (tečky, čárky, závorky, uvozovky, apod.).

 
//Rozdělení textového řetězce na prvky pole - náhrada funkce explode - pro více oddělovačů současně
//Martin Adámek, www.adamek.cz

/////////////////////////////////////
//$oddelovace              Pole obsahující jednoznakové oddělovače (Dvouznakové oddělovače jsou definované níže, přímo v kódu) 
//$co                      Textový řetězec, který chcete rozsekat na jednotlivá slova
//                         Na závěr se jednotlivě upravená slova slepí zpět zase do této proměnné
//$polekontrolovanychslov  Pole, do kterého se jednotlivá izolovaná slova uloží
///////////////////////////////////// 


$oddelovace=array(" ", ".", ",", ";", "-", "?", "!", "_", ":", "(", ")", "/");
$slovo=""; $polekontrolovanychslov=array();


// Rozsekání řetězce (věty) na slova

for ($i=0; $i<strlen($co);$i++)
  {
    if (substr($co,$i,2)=="\\\"" or substr($co,$i,2)=="\\\\" or substr($co,$i,2)=="\\'") 
      {$polekontrolovanychslov[]=$slovo; $polekontrolovanychslov[]=substr($co,$i,2); $slovo="";$i++;}
      //odhalení zpětným lomítkem vyescapovaných znaků - zpětného lomítka i obou typů uvozovek   
    
    elseif (in_array($co[$i], $oddelovace))
      {$polekontrolovanychslov[]=$slovo; $polekontrolovanychslov[]=$co[$i]; $slovo="";}
    
    else
      {$slovo.=$co[$i];}        
  }
$polekontrolovanychslov[]=$slovo;
unset($slovo);

/*
V tomto místě je celý rozkouskovaný řetězec uložen v poli $polekontrolovanychslov ,
pro některé aplikace můžete zbytek kódu ignorovat a výše uvedený kód si hodit do funkce.
*/ 


// Kontrola, úprava, oprava či jiná cenzura jednotlivých slov       

foreach ($polekontrolovanychslov as &$prvek) 
  { if ($prvek=="AZeMeNenajdes") $prvek="NaselJsemTe";
    /* Tady si s každým izolovaným slovem udělejte, co potřebujete. */
  } 
unset($prvek);


// Pospojování opravených slov zpět do jednoho řetězce (zcenzurované věty)

$co=implode("",$polekontrolovanychslov); 
  //Protože patřičné oddělovače jsou uloženy jako samostatná slova (prvky pole), můžeme pro znovuspojení řetězce použít běžnou funkci implode
  //a jako lepidlo (což obvykle bývá mezera, podle které funkce explode řetězec rozdělila) nastavit prázdný řetězec. 

/*
V proměnné $co máme opravenou větu jako jeden textový řetězec.
*/

Řetězec tak máme zase pohromadě v jedné stringové proměnné, ale hledaná slova jsme upravili, jak jsme potřebovali.
Například jsme je mohli porovnat se seznamem sprostých slov a nahradit je hvězdičkami.

Tento algoritmus tedy můžete použít např. jako základ skriptu pro filtrování vulgárních slov v diskuzích a komentářích, potřebujete-li naprogramovat filtr sprostých slov.

Komentáře návštěvníků

Pokud máte účet na Facebooku

(nebo jiném z několika podporovaných serverů)

Chovejte se tady jako doma, ať vidíme, jak to u vás vypadá.
[nápis v linkovém autobusu]

A priori upřímně doufám, že mě obsah a forma příspěvků nedonutí k žádným moderátorským zásahům,
ale právo zásahu si vyhrazuji, protože tyto komentáře jsou přístupné komukoliv, kdo se zaregistroval na FB, a já netuším, co se tu může objevit.

V souvislosti s vkládáním odkazů na Vaše weby do komentářů nejsem hysterický. Odkaz na nekomerční web s relevantním obsahem, který může pomoci ostatním návštěvníkům, uvítám.

 
Načíst sem facebookové komentáře
pro čtení (aktuální počet: 0)
nebo přidání vlastního

(vyžadován javascript)
 
Komentáře se záměrně nenačítají samy, aby až do jejich načtení:
Facebook nevěděl, že jste tady právě vy,
nezkazila se přizpůsobivost webu a kvalita kódu
a nezvyšoval se datový tok.
 
Facebook ví, že tuto stránku teď někdo navštívil, ale na rozdíl od řešení obvyklého na drtivé většině jiných webů s FB pluginy tady díky mému způsobu realizace nepoznal, že jste to byli právě vy.

 

Pokud nemáte účet na Facebooku

Komentářový plugin Facebooku umožňuje vkládat komentáře i prostřednictvím účtů na několika dalších serverech (i když u nás nejsou moc používané).

Pokud nemáte žádný účet, prostřednictvím kterého byste sem mohli napsat komentář, neberte to jako diskriminaci. Zkrátka jsou tu komentáře alespoň pro uživatele FB a pár dalších serverů, což je lepší, než kdyby tu nebyly vůbec.

Kromě zjevné nevýhody má toto řešení i své výhody:

  • Při použití své FB identity by se většina uživatelů mohla zamyslet, co vypouští z prstů.
  • Odkaz na komentovanou stránku se může šířít Facebookem.
  • Ve výchozím nastavení se přednostně zobrazují komentáře zanechané návštěvníkovými facebookovými známými, což v důsledku podporuje obě předchozí výhody.

Navíc většina neuživatelů FB zůstává mimo FB ze svého vlastního rozhodnutí, takže jim neužívání Facebooku přináší různé pro ně důležité výhody (soukromí, čas), které snad vykompenzují nemožnost sem něco napsat.
Případně je možné jako náhradní možnost použít návštěvní knihu společnou pro celý web.
Časem třeba napíšu nebo nasadím nějaký jiný komentářový systém, který bude mít menší omezení pro komentátory, ale teď je tu alespoň toto.

Ale i tak si můžete alespoň přečíst komentáře od ostatních.

Strukturovaný opis komentářů

Pro:

  • paranoidní jedince, kteří nechtějí, aby FB věděl, že právě oni navštívili tuto stránku,
  • programátory, kterým se ta struktura vnořených polí bude líbit,
  • uživatele mobilních zařízení, kteří nechtějí, aby FB pokazil přizpůsobivost webu,
  • případný prohlížeč bez javascriptu
  • webový archiv, který si je takto uloží jako statický text dostupný v budoucnu i bez spolupráce Facebooku.
Array
(
    [http://www.adamek.cz/sw/php/explode-vice-oddelovacu/] => Array
        (
            [comments] => Array
                (
                    [data] => Array
                        (
                        )

                )

        )

)

Skok nahoru na: Navigační menu (klávesová zkratka „5”)

Jste tu opakovaně?
Novinky na webu

RSS výstup zatím není

Nabízím

 

Zaujala Vás tato stránka?

  • Přidat do záložek (Ctrl+D)
  • Sdílet odkaz (vysílačka)Skok nahoru na:
  • Vytisknout (Ctrl+P)
  • Citovat podle ČSN ISO 690

    Tuto stránku

    ADÁMEK, Martin. PHP - Náhrada funkce explode - skript s více oddělovači slov současně: Rozdělení věty na slova; kontrola, oprava a cenzura oddělených slov; znovusestavení věty. Martin Adámek [online]. Náchod [cit. 2014-04-17]. Dostupné z: http://www.adamek.cz/sw/php/explode-vice-oddelovacu

    Celý web

    ADÁMEK, Martin. Martin Adámek [online]. Náchod [cit. 2014-04-17]. Dostupné z: http://www.adamek.cz

 

 
 

Národní kulturní dědictví

Stránky archivovány Národní knihovnou ČR Tyto stránky jsou pravidelně archivovány Národní knihovnou ČR pro svou kulturní, vzdělávací, vědeckou, výzkumnou nebo jinou informační hodnotu za účelem dokumentace autentického vzorku českého webu. Jsou součástí kolekce českých webových stránek, které NK ČR hodlá dlouhodobě uchovávat a zpřístupňovat pro budoucí generace. Jejich záznam je součástí České národní bibliografie a katalogu NK ČR.  

 

 
 

Pro rozptýlení

Co je to pí?
Matematik: „Pí je poměr obvodu a průměru kruhu.”
Fyzik: „Pí je 3,1415927 plus mínus 0,00000005.”
Inženýr: „Pí je něco kolem tří…”

 

Pro zamyšlení

Člověk je velký ve svých předsevzetích, ale slabý v jejich provádění.
[Erich Maria Remarque]