Autor Zpráva
Keilew
Profil
Ahoj, není tu nějaký šikula, co umí hoodně dobře regulární výrazy a dokáže vytvořit regulární výraz pro správné zaměňování dělitelné mezery za nedělitelnou ( ) v řetězci?
Zerog
Profil
Asi hloupy dotaz ale nestaci to udelat takhle?

$text=str_replace (" "," ",$text);
Petr Tichý
Profil
Zerog
Spíš by to asi chtělo jen tam, kde to má být. Nikoliv všude. To by pak byl ten text na jeden řádek.
Str4wberry
Profil
Zerog
Jen jestli to Keilew nemyslel třeba z typografického hlediska. Jako nahrazovat u jednopísmenných slov atp.
Zerog
Profil
No prove zalezi na tom co v te promene vlastne bude. Jaky je vlastne spravny ucel nedelitelne mezery?
Keilew
Profil
Zerog
Přesně, takhle by to bylo všude. Mohlo by jít toto? "(s|z|na|v|ve|před|pod|od|do)\s" nahradit za "$1 ", ale asi to nebude to pravé ořechové. Co třeba se "se"? Jako zvratné tentononc to není potřeba nedělit, ale jako předložku ano...
Mastodont
Profil
Zerog
Nedělitelná mezera zajišťuje, aby na konci řádku nezůstala předložka bez následujícího slova. IMHO se používá ale i u spojek.

Keilew
"před" a "pod" jsou dost dlouhé, ty opticky IMHO tolik nevadí.
Keilew
Profil
Mastodont
Nevadí, ale jsou to předložky a ty nesmějí zůstat na konci. Ale to už je detail. Na spojky se to nevztahuje, alespoň tak nás to učili ve škole;-) Kdysi...
Petr Tichý
Profil
Keilew
Osobně bych řekl, že pouze jednopísmenové předložky nesmějí být na konci řádku.

// "V češtině pak má tvrdá mezera ještě jedno nezastupitelné místo. Může zaručit, že se jednopísmenná předložka, spojka či libovolný jeden znak nikdy neobjeví na konci řádku."
Mastodont
Profil
Keilew
To tedy nemyslím: http://blog.converter.cz/index.php?p=513&c=1
Zerog
Profil
No vidite, to me nikdy nenapadlo ze pravej ucel je zrovna tenhle :) sou veci.

Stejne se tam asi budou muset vypsat vsechny ty predlozky a spojky rucne ..asi ..ne? A to jeste bude muset znat ty vyjimky... (ten regularni vyraz)
bukaj
Profil
Keilew
Na spojky se to nevztahuje
ale vztahuje... :)
Keilew
Profil
No na ZŠ i Gymplu nás učili, že tam nesmí zůstat žádná, ale to je jedno. Pak to bude vypadat:
"(k|K|o|O|s|S|u|U|v|V|A|\w\.|Ing\.|Bc\.|MUDr\.|JUDr\.|Mgr\.)\s" a zbytek už nevím, jak tam nacpat...
Keilew
Profil
bukaj
http://blog.converter.cz/index.php?p=513&c=1
Ne a nikdy nevztahovalo:-)
krteczek
Profil
proč se trápit s regulárama když už to někdo udělal za nás?
http://texy.info
nebo <reklama> http://texyla.jaknato.com (AJAX nadstavba nad texy + vnitřní rozhraní pro zpracování textu v php pomocí texy => stále ve vývoji ;-))</reklama>
Keilew
Profil
Tak jsem dospěl k závěru, že je to nejednoznačné. Ani Pravidla českého pravopisu v tom nejsou jasná. Obecně platí, že na konci nesmí zůstat v, s, z, k na konci řádku. AJČ AV ČR také píše, že by tam nemělo být ani a, i, o, u. Dle některých konvencí ani ve, ke, ku, ze, na, do, od, pod. Tak si vyberte:-)
Jo a v žádném případě nepište "velkoobchod papírem", ale "velkoobchod s papírem"! Zrovna tak "kdo s koho" je značně archaické - píše se správně "kdo z koho"! To jsou dvě velice časté chyby...
Petr Tichý
Profil
"Kdo s koho" je správně.
Keilew
Profil
"Kdo z koho" taky:-) "Kdo s koho" je staročeská varianta - vazba se 4. pádem. Ustupuje a mizí, stejně jako gymnásium apod.
bukaj
Profil
Keilew
Ne a nikdy nevztahovalo:-)
AJČ AV ČR také píše, že by tam nemělo být ani a, i
právě tyto spojky jsem měl namysli
Keilew
Profil
bukaj
Tak neglobalizuj, protože "protože" je taky spojka:-)
Téma "kdo s koho" apod. přesunuto na Typografii!
Zde pokračují jen regulární výrazy...
Keilew
Profil
Jak spojit tyto dvě regulární procedury?


$pattern = "[[:<:]](k|s|v|z|a|i|o|u|ve|ke|ku|ze|na|do|od|pod|před|nad|Ing.)[[:bl ank:]]{1}";
$replacement = "\1&nbsp;";

$retezec = eregi_replace($pattern, $replacement, $retezec);

$pattern = "(&[a-z]+;)(k|s|v|z|a|i|o|u|ve|ke|ku|ze|na|do|od|pod|před|nad|Ing.)[[ :blank:]]{1}";
$replacement = "\1\2&nbsp;";
$retezec = eregi_replace($pattern, $replacement, $retezec);

echo $retezec;


Potřebuju, aby to fungovalo pro případ "a na náměstí" -> "a&nbsp;na&nbsp;náměstí".
Tohle nefunguje:


$pattern = "([[:<:]]|&[a-z]+;)(k|s|v|z|a|i|o|u|ve|ke|ku|ze|na|do|od|pod|před|nad|Ing.)[[:blank:]]{1}";
krteczek
Profil
to je logické, protože:
1. "a na náměstí" => 1 "a&nbsp;na náměstí" to je v pořádku
2. "a&nbsp;na náměstí" jsou to pro regulár dvě slova ;-) takže je třeba upravit regulár...
Keilew
Profil
Konkrétně?
krteczek
Profil
Keilew: uvědom si že celý text se prochází postupně (v sérii) takže v momentě kdy se nahradí mezera za "a" na "&nbsp;" už nebudou 3 slova: "a", "na", "náměstí" s mezerami před nimi, ale jen dvě slova "a&nbsp;na" a "náměstí" s mezerou mezi, a tudíž nebude platit regulární výraz pro "na" protože už tam vlastně není
regulár musíš upravit tak, aby bral kromě mezer i "&bsp;" před konkrétním seznamem slov
Keilew
Profil
Chápu, ale původně jsme myslel, že to vyřeší ta alternace ([[:<:]]|&[a-z]+;)...asi špatně... tak já jdu dumat...
MzM
Profil
na to byla přímo napsaná knihovnička (fce)... kdysi jsem ji použil...
jo, "skoba" se to jmenovalo viz http://www.kai.tul.cz/~satrapa/sw/skoba/
je to sice perl, ale věřím, že to snadno přepíšete na PHP...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: