Autor Zpráva
iru
Profil
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
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
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
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
AM:
díky moc, ale bohužel výsledek je stejný...
iru
Profil
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
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
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
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
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
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
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
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
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
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
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
Omlouvám se moc! Měla jsem tam překlep, tohle už funguje, jak má. Děkuji, moc mi to pomohlo...

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:

0