Pogledajte određenu poruku
Staro 18. 08. 2007.   #8
Pedja
Predrag Supurović
Grand Master
 
Datum učlanjenja: 24.01.2006
Lokacija: Užice
Poruke: 791
Hvala: 3
200 "Hvala" u 12 poruka
Pedja is on a distinguished roadPedja is on a distinguished roadPedja is on a distinguished road
Default

Uspeo sam da napravim parsiranje. RAdi sve kako treba ako korsitim <lang></lang> i to mi cak radi posao posto se ti pomocni tagovi nece pojavljivati u izlaznom dokumentu. Medjutim imam problem, taj tag bi u svtvati reba da izgleda ovako:

nekitekst<lang id="en">nekitekst</lang>

U prvoj liniji prilozenog koda je regext koji match-uje <lang id="en"> ali mi ne uspeva da na isti nacin namestim da radi izraz za pretragu koji je definisan u promenljivoj $regex.

Trebalo bi da parsisa sa ovim id="en" (gde en moze biti bilo koja oznaka jezika) i da tu oznaku jezika mogu da procitam kako bih parsiranom segmentu naznacio da je u tom jeziku. U prilozenom kodu, promenljivoj $m_cur_lang treba da se dodeli procitana oznaka jezika.

Al' nece pa nece...

Kôd:
<pre>
<?php

echo preg_match ('#\<lang( (.)*)*\>#', '   <lang id="sr">   ');

$input = "nivo1<lang>nivo2<lang>nivo3<lang>nivo4</lang></lang>nivo2</lang>nivo1<lang>nivo2</lang>nivo1";

echo "input = $input\n";

$parsed = parseLang ($input, 'sr');

print_r ($parsed);

echo "result = " . joinLang ($parsed);

function parseLang ($p_input, $p_def_lang) {
	$regex = '#\<lang\>((?:[^<]|\<(?!/?lang\>)|(?R))+)\</lang\>#';
	
	if (preg_match ($regex, $p_input)) {
		$split = preg_split ($regex, $p_input,2);

		//tekuci nivo, prefiks
		unset ($m_out);
		$m_out['lang'] = $p_def_lang;
		$m_out['value'] = $split[0];
		$out[0] = $m_out;

		// sledeci nivo po dubini
		$m_input = $p_input;
		if (strlen ($split[0]) > 0) $m_input = substr ($m_input, strlen ($split[0]));
		if (strlen ($split[1]) > 0) $m_input = substr ($m_input, 0, - strlen ($split[1]));
		
		$m_cur_lang = $p_def_lang; // ovde treba izvuci vrednost iz lang taga
		
		$m_input = preg_replace ($regex, '$1', $m_input);		

		unset ($m_out);
		$m_out[0] = parseLang ($m_input, $m_cur_lang);
		$out[1] = $m_out;
		
		// tekuci nivo, sufiks
		unset ($m_out);
		$m_out['lang'] = $p_def_lang;
		$m_out = parseLang ($split[1], $m_out['lang']);
		$out[2] = $m_out;
			
		$m_result = $out;
	} else {
		$m_result['lang'] = $p_def_lang;
		$m_result['value'] = $p_input;
	}
	return ($m_result);
}

function joinLang ($p_input) {
	$m_result = '';
	foreach ($p_input as $m_item) {
		if (isset ($m_item['value'])) {
			if (! empty ($m_item['value'])) {
				$m_result .= '<lang' /* id="' . $m_item['lang'] . '"'*/ . '>' . $m_item['value'];
			}
		} else {
			$m_result .= joinLang ($m_item);
		}
	}
	$m_result .= '</lang>';
	return ($m_result);
}

?> 
</pre>
Pedja je offline   Odgovorite uz citat