Autor | Zpráva | ||
---|---|---|---|
iru Profil |
#1 · Zasláno: 6. 8. 2010, 20:58:52
Zdravím,
mám v databázi seznam jmen a text, který tyto jména obsahuje, ty jména procházím cyklem, vyhledám v textu a uzavírám do <a href="neco">jmeno</a> pomocí preg_replace. Všechno v pořádku, dělá to, co má, až na malý detail... Jsou tam dvě podobná jména (uvedu na příkladu, ať tu někoho nejmenuju) dejme tomu "test" a "testik" a u jména "testik" se mi uzavře do odkazu jen testik, potřebuji, aby to tyto jména rozlišovalo a nevím, jak na to... Díky za radu. |
||
AM_ Profil |
#2 · Zasláno: 6. 8. 2010, 21:10:14
iru:
„preg_replace“ rozhodni se, zda ereg_replace nebo preg_replace, v názvu tématu je ereg_replace. Doporučuji preg, model ereg je deprecated a v PHP6 (dá-li Bůh) už nebude vůbec. asi sem budeš muset napsat ten regulární výraz, v něm je zřejmě chyba. |
||
iru Profil |
#3 · Zasláno: 6. 8. 2010, 21:28:40
toto je funkce, která s tím pracuje:
function DabingJmena($dabing) { $dotaz = "SELECT * FROM dabing"; $vysledek = mysql_query($dotaz); while ($vypis = mysql_fetch_array($vysledek)){ $id_dabing = $vypis['id']; $jmeno = $vypis['jmeno']; $prijmeni = $vypis['prijmeni']; $prezdivka = $vypis['prezdivka']; $cele_jmeno = $jmeno.' '.$prijmeni; $dabing = ereg_replace($cele_jmeno, '<a href="index.php?obsah=hledej-dabing&id_dabing='.$id_dabing.'" >'.$cele_jmeno.'</a>', $dabing); if ($prezdivka !=''){ $dabing = ereg_replace($prezdivka, '<a href="index.php?obsah=hledej-dabing&id_dabing='.$id_dabing.'" >'.$prezdivka.'</a>', $dabing); } } return $dabing; } $dabing = DabingJmena($dabing); |
||
AM_ Profil |
#4 · Zasláno: 6. 8. 2010, 21:37:48
aha. takže ereg_replace nahraď za str_replace a je vystaráno. Žádný regulární výraz tam nemáš, bohužel zlozvyk některých programátorů je používat ereg_replace i tam, kde nahrazují prostý text.
|
||
iru Profil |
#5 · Zasláno: 6. 8. 2010, 21:44:10
AM:
díky moc, ale bohužel výsledek je stejný... |
||
iru Profil |
#6 · Zasláno: 6. 8. 2010, 22:44:30 · Upravil/a: iru
zkoušela jsem měnit pořadí těch jmen v databázi, když je napřed kratší a pak delší, tak se v textu, kde je to delší, které se má vložit do odkazu, do odkazu vloží ta kratší varianta a delší má smůlu. A když to udělám naopak, tak vznikne něco takového:
<a href="index.php?obsah=hledej-dabing&id_dabing=212" ><a href="index.php?obsah=hledej-dabing&id_dabing=213" >test</a>ik</a> pokusím se to líp vysvětlit, jak se na to dívám, ten můj výklad je hrozný... takže mám v databázi seznam jmen: "test, testik, petr, pavel, lucka" mám text "nějaký text, který obsahuje některá jména a taky jméno testik" a já potřebuju vzít ten text a pokud se v něm vyskytuje nějaké jméno ze seznamu jmen, tak k němu přidat odkaz. Jenže když se v textu vyskytuje slovo "testik", tak se mi nenahradi za odkaz "testik", nýbrž jen jeho část "test" |
||
Hologos Profil |
#7 · Zasláno: 6. 8. 2010, 23:44:50
A proč si nejdřív nebrat jednotlivá slova a na těch to testovat? A pokud to bude odpovídat, vezme se 1. nalezené a z celého slova se udělá odkaz?
Takže něco jako: $slova = explode(' ', $text); // bylo by lepší rozdělovat regulárním výrazem, který by obsahoval, co jméno může obsahovat foreach($slova as $slovo) { // otestovat, zda je v DB a případně nahradit celé $slovo za <a href="...">$slovo</a> } |
||
AM_ Profil |
#8 · Zasláno: 7. 8. 2010, 11:58:46
Můžeš zkusit ještě toto:
$dabing = preg_replace("~\\b$cele_jmeno\\b~", '<a href="index.php?obsah=hledej-dabing&id_dabing='.$id_dabing.'" >'.$cele_jmeno.'</a>', $dabing); Nahradí jméno jen tam, kde se jedná o celé slovo (takže např. xxxtestxxx nebude nahrazeno jméno "test", kdežto v (xxx test!) ano. |
||
iru Profil |
#9 · Zasláno: 7. 8. 2010, 19:52:18
AM:
zkusila jsem tvoje řešení, problematické slovo to vyřešilo, jenže se mi vyskytnul jiný problém a to, že do odkazu se mi některá jména nevložila a netuším čím to může být, nevidím žádnou odlišnost ve jménech, která se vložila a v těch, co se nevložila. Mohlo by toto způsobovat to, že jména se skládají z křestního jména a příjmení? Ale to jsou zase všechny stejný. Hologos: toto: $slova = explode(' ', $text); by mělo text rozdělit na slova v místech, kde je mezera? Jestli je to tak, tak by to nešlo, protože mezera je zrovna mezi křestním jménem a příjmením a aby to nebylo tak jednoduchý, tak se jména nacházejí v ostatním textu, který popisuju další informace. A ještě k tomu jsou jména někde oddělena čárkou, když je na konci věty, tak tečkou. Takže mě nenapadá nic, podle čeho bych je mohla v tom textu jednoznačně identifikovat:-( |
||
AM_ Profil |
#10 · Zasláno: 7. 8. 2010, 19:55:56
iru:
„že do odkazu se mi některá jména nevložila a netuším čím to může být, nevidím žádnou odlišnost ve jménech, která se vložila a v těch, co se nevložila.“ zkus sem ta jména napsat (a nejlépe i zdrojový text), třeba my na tu odlišnost přijdeme. „Mohlo by toto způsobovat to, že jména se skládají z křestního jména a příjmení?“ nemělo by. Jen zde nebude vyřešen zmiňovaný problém (pokud nejdřív replacuješ "jan" a pak "jan novák", tak "jan novák" přijde zkrátka). |
||
iru Profil |
#11 · Zasláno: 7. 8. 2010, 19:59:44
AM:
> „Mohlo by toto způsobovat to, že jména se skládají z křestního jména a příjmení?“ > nemělo by. Jen zde nebude vyřešen zmiňovaný problém (pokud nejdřív replacuješ "jan" a pak "jan novák", tak "jan novák" přijde zkrátka). nee, napřed je složím a pak nahradím: $cele_jmeno = $jmeno.' '.$prijmeni; |
||
iru Profil |
#12 · Zasláno: 7. 8. 2010, 20:02:44 · Upravil/a: iru
tak a tady je ten text, kde mám problematické jméno řešené tou mou první variantou:
vyrobilo Studio Auvit v rcoe 2006, v českém znění: <a href="index.php?obsah=hledej-dabing&id_dabing=211" >Jiří Schwarz</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=11" >Tereza Chudobová</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=212" ><a href="index.php?obsah=hledej-dabing&id_dabing=213" >Petr Štěpán</a>ek</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=205" >Veronika Veselá</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=98" >Aleš Jarý</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=244" >Petra Tišnovská</a>, Jan Pohan, <a href="index.php?obsah=hledej-dabing&id_dabing=38" >Tomáš Juřička</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=118" >Milan Bouška</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=210" >Roman Hájek</a>, Radek Škvor a tady toto vypadne na stejném textu s tvým skriptem: vyrobilo Studio Auvit v rcoe 2006, v českém znění: <a href="index.php?obsah=hledej-dabing&id_dabing=211" >Jiří Schwarz</a>, Tereza Chudobová, <a href="index.php?obsah=hledej-dabing&id_dabing=212" >Petr Štěpánek</a>, Veronika Veselá, Aleš Jarý, Petra Tišnovská, Jan Pohan, <a href="index.php?obsah=hledej-dabing&id_dabing=38" >Tomáš Juřička</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=118" >Milan Bouška</a>, <a href="index.php?obsah=hledej-dabing&id_dabing=210" >Roman Hájek</a>, Radek Škvor To problematické jméno je Petr Štěpánek a Petr Štěpán. A z těch co se mají vložit do odkazu a nevloží je např. Tereza Chudobová a ještě další, je to vidět v tom kódu... |
||
AM_ Profil |
#13 · Zasláno: 7. 8. 2010, 20:12:18
Aha, \b má problém s diakritikou, touto cestou je to asi neřešitelné, omlouvám se za blbé řešení.
zkus toto: preg_replace("~$cele_jmeno(?![^<]*</a>)~", '<a href="index.php?obsah=hledej-dabing&id_dabing='.$id_dabing.'" >'.$cele_jmeno.'</a>', $dabing); to je celkem jednoduchý způsob, jak se vyhnout dvojímu označení. |
||
iru Profil |
#14 · Zasláno: 7. 8. 2010, 20:23:12
AM:
neomlouvej se, já jsem vděčná, když se mi na to někdo pomůže podívat, protože fakt nevím... tak tomuto se nepodařilo najít žádný jméno: vyrobilo Studio Auvit v rcoe 2006, v českém znění: Jiří Schwarz, Tereza Chudobová, Petr Štěpánek, Veronika Veselá, Aleš Jarý, Petra Tišnovská, Jan Pohan, Tomáš Juřička, Milan Bouška, Roman Hájek, Radek Škvor |
||
AM_ Profil |
#15 · Zasláno: 7. 8. 2010, 20:31:25 · Upravil/a: AM_
Tak to je poněkud zvláštní, mě toto funguje, testoval jsem to, když to zadám natvrdo:
$dabing = '...znění: Jiří Schwarz, Tereza Chudobová, Petr Štěpánek, Veronika Veselá, Aleš Jarý, ...'; $dabing = preg_replace("~Petr Štěpánek(?![^<]*</a>)~", '<a href="#">Petr Štěpánek</a>', $dabing); $dabing = preg_replace("~Petr Štěpán(?![^<]*</a>)~", '<a href="#">Petr Štěpán</a>', $dabing); echo $dabing; Dává to naprosto správný výsledek, označí to Petr Štěpánek a Petr Štěpán už označen není konkrétně: ...znění: Jiří Schwarz, Tereza Chudobová, <a href="#">Petr Štěpánek</a>, Veronika Veselá, Aleš Jarý, ... problém tedy bude jinde... |
||
iru Profil |
#16 · Zasláno: 7. 8. 2010, 21:16:26
Tady je kousek toho cyklu naplněného daty, který jsem nechala vypsat přes echo:
("~Zdeněk Mahdal(?![^<]*</a>)~", '<a href="#" >Zdeněk Mahdal</a>', $dabing)("~Marek Libert(?![^<]*</a>)~", '<a href="#" >Marek Libert</a>', $dabing)("~Michal Holán(?![^<]*</a>)~", '<a href="#" >Michal Holán</a>', $dabing)("~Tereza Chudobová(?![^<]*</a>)~", '<a href="#" >Tereza Chudobová</a>', $dabing)("~Libor Hruška(?![^<]*</a>)~", '<a href="#" >Libor Hruška</a>', $dabing)("~Michal Jagelka(?![^<]*</a>)~", '<a href="#" >Michal Jagelka</a>', $dabing)("~Pavel Šrom(?![^<]*</a>)~", '<a href="#" >Pavel Šrom</a>', $dabing)("~Zuzana Skalická(?![^<]*</a>)~", '<a href="#" >Zuzana Skalická</a>', $dabing)("~Jiří Krampol(?![^<]*</a>)~", '<a href="#" >Jiří Krampol</a>', $dabing)("~Pavel Rímský(?![^<]*</a>)~", '<a href="#" >Pavel Rímský</a>', $dabing)("~Petr Gelnar(?![^<]*</a>)~", '<a href="#" >Petr Gelnar</a>', $dabing) a v proměnné $dabing je toto: "vyrobilo Studio Auvit v rcoe 2006, v českém znění: Jiří Schwarz, Tereza Chudobová, Petr Štěpánek, Veronika Veselá, Aleš Jarý, Petra Tišnovská, Jan Pohan, Tomáš Juřička, Milan Bouška, Roman Hájek, Radek Škvor" |
||
iru Profil |
#17 · Zasláno: 7. 8. 2010, 21:23:57
Omlouvám se moc! Měla jsem tam překlep, tohle už funguje, jak má. Děkuji, moc mi to pomohlo...
|
||
Časová prodleva: 14 let
|
0