webForumDet fria alternativet

Få ut attributes från en specialtagg

PHP

2 svar · 240 visningar · startad av Neo

Medlem sedan dec. 200079 inlägg
Frågan#1

Hej Allihopa!

Jag försöker skriva en funktion som går igenom en fil (eller en sträng) och ersätter mina special-taggar med include filer efter vad det är för typ av funktion jag specificerat i special-taggen.

Jag har kommit så här långt:

<?

$xml = 'bla bla bla <specialtag type="news" amount="5" category="2" user="1" /> bla bla bla';

function GetElementByName ($xml, $start, $end) {

global $pos;
$startpos = strpos($xml, $start);
if ($startpos === false) {
return false;
}
$endpos = strpos($xml, $end);
$endpos = $endpos+strlen($end);
$pos = $endpos;
$endpos = $endpos-$startpos;
$endpos = $endpos - strlen($end);
$tag = substr ($xml, $startpos, $endpos);
$tag = substr ($tag, strlen($start));
$tag = explode(' ', $tag);
// $tag = trim($tag);

return $tag;

}

$special_tags = GetElementByName ($xml, "<specialtag ", " />");

print_r($special_tags);

?>

Den här koden genererar en array som ser ut så här:

Array ( [0] => type="news" [1] => amount="5" [2] => category="2" [3] => user="1" )

Det är ju jättebra men det är 2 problem kvar:

1. Jag vill ha variabler med värden i, alltså $type='news' $amount='5' osv.

2. Jag vill köra igenom hela filen och hitta alla specialtaggar med en loop.

Jag har hållt på ett tag med känner att jag har kört fast lite, kanske någon har en bättre lösning på det här problemet.

Medlem sedan sep. 200436 inlägg
#2

Här har du en funktion som kan ta fram alla olika slags taggar med alla de atribut du vill. Du måste dock ändra i funktionen vad du vill byta ut de olika sakerna mot. Men jag har skrivit så du lätt ska hitta och förstå. Här kommer den ( dock lite sparsamt betatestad men ändå)

<?php
$xml = "Jag är en ninja som går på stan. Det är rätt cooolt <br /><specialtag type=\"news\" amount=\"5\" />";
$xml = check_tag("<specialtag","/>",$xml,"type=,amount=");
print_r($xml);

###############################################################################################
### funcktion för att ta fram en array över alla tagar av en viss typ, med alla dess attribut.
###	attributen anges som fjräde parameter så här src=,type=,amount=
###	altså bara attirbut namnet följt av ett likhetstecken och åtsklijda av komman.
##############################################################################################

function check_tag($start_tag,$end_tag,$string,$attr_list) {
 
 $attr_list = explode(',',$attr_list); # dela upp ala attr som ska tas fram i en array
 $offset = 0;
 $i = strpos($string,$start_tag,$offset);
 while ($i !== FALSE) { # loopa igenom alla taggarna	
	
	$xml_offset = NULL;	
	$start = strpos($string,$start_tag,$offset);  # ta fram var taggen börjar
	if($start !== FALSE) { #om det finns en av den eftersökta tagen
 		
		$xml_string = substr($string,$start);  ## gå till där taggen har börjat	
		$xmllen = strpos($xml_string,$end_tag);  ## ta fram var xml taggen tar slut			
		
		if($xmllen !== FALSE) { #om det finns ett slut på xml taggen

			$xml_string = substr($xml_string,0,$xmllen); # ta fram själva xml taggen
		
			### LOOPA igenom alla attributen och lägg in värdena i en sträng
			for($j = '1';$j <= count($attr_list); ++$j) {
				@$temp = get_attr($xml_string,$attr_list[$j-1]);
				@$attr_string[] = ($temp != NULL) ? $temp : "";	
			}
			
			# ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #
			# 			ska något göras med varje xmltag så ska det göras hät
			# ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #
			
			##########################################################
			#### TEX KAN DET SE UT SÅ HÄR
			#########################################################
			# include('min_includefil.php');
			
			if($attr_string['0'] == "news") { // kolla om första attributet har värdet news
							// det första atirbutet är altså det som står först
							// i listan över attirbut du skickar till funktionen.			
				$ny_kod = "Mina nyheter här"; 
			} else { // annars vet vi inte vad som ska in
				$ny_kod = "Jag vet inte vad som skulle in här";
			}
			
			// byt ut den gamla xml taggen mot vad vi nu ville byta ut den mot
			$string = str_replace($xml_string.$end_tag, $ny_kod, $string);
					
			#### ta fram var den här nya taggen slutade (viktigt att detta är rätt).
			###	För annaars kan det bli en aldrig slutande loop
			$xml_offset = strpos($string,$ny_kod,$offset) + strlen($ny_kod);
			
			# ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #
			# 	SLUT PÅ VAR MAN SKA GÖRA SAKER MED KODEN
			# ¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤¤ #	
				
		} # slut på om xmllen != null
	
 	}# slut på om start != null
 	
	if($xml_offset !== NULL) {  ## kolla om vi hittat en tag
		$offset = $xml_offset; ## isf sätt en ny offset
	} else { ## annars sett offsetten till slutet av $string för att avsluta
 		$offset = strlen($string); 		
 	}
 	
	$i = strpos($string,$start_tag,$offset);			
 } #slut på while loopen 
 return $string;
} # slut på funcktionen

###############################################################################################
### funcktion för att kolla om xxx='yyy' eller xxxx="yyy" finns i en sträng och isf ta ut yyy
### $attr ska vara  tex class=  eller id
##############################################################################################
function get_attr($string,$attr) {
	$a_len = strlen($attr);
	$attr_pos = strpos($string,$attr); ## ta reda på var attr börja
	$attr_string = substr($string,($attr_pos+$a_len));  ## ta fram biten som kommer efter src= 
		#(+attr_len pga tex src= är 4 bokstäver)
				
		if($attr_pos != NULL && $attr_string != NULL) { # om det finns attributet i en string

			$enc_char = substr($attr_string,0,1); ## ta fram vad för tecken som omsluter src=			
			$enc_check = "0"; # bara så vi vet hur långt vi ska flytta senare			
			if($enc_char == " ") {  ## gör så utifall man har så här src= " och inte src="
				
				$enc_char = substr($attr_string,1,1); 
				$enc_check = "1"; # bara så vi vet hur långt vi ska flytta senare
	 		}
		
			if($enc_char == '"' || $enc_char == "'") { # vi har nu vad som omsluter src antingen " eller '		

				$attr_string = substr($attr_string,$enc_check); # ta ut det som kommer efter src="
				$attr_len = strpos($attr_string,$enc_char,($enc_check+1)); # ta fram var src slutar, 
				# det sista är för att komma förbi den första ' eller "			
				$attr_string = substr($attr_string,($enc_check+1),($attr_len-1)); # ta fram bara src, tabort första "
				
				$string = $attr_string;
			} else { # om vi inte hittar enc_char
				$string = NULL;
			} # slut på if enc_char == " eller '
		} else { # om attr_pos eller attr_string == NULL
				$string = NULL;
		} # slut på if attr_pos eller attr_string != null
	return $string;
} #slut på funktionen
#################################################################
?>
Medlem sedan dec. 200079 inlägg
#3

Tack jOOOL... men den är lite buggig.

Jag får funktionen att loopa igenom allt men den kommer aldrig förbi första specialtaggen...

Parsningen av följande sträng:

$xml = 'Jag är en ninja som går på stan. <specialtag type="content" amount="1" category="1" user="1" /> Det är rätt cooolt <br /><specialtag type="archive" amount="5" category="2" user="1" /> och jag är väldigt tyst oxå... <specialtag type="news" amount="7" category="2" user="1" />';

Blir content-replace koden hela tiden:

Jag är en ninja som går på stan. Här ska vi ha en innehåll! Det är rätt cooolt
Här ska vi ha en innehåll!Här ska vi ha en innehåll! och jag är väldigt tyst oxå... Här ska vi ha en innehåll!Här ska vi ha en innehåll!Här ska vi ha en innehåll!

Detta är kod-snutten jag la in:

		if($attr_string\['0'\] == "content") {
			$ny_kod .= "Här ska vi ha innehåll!"; 
		}

men funktionen tror att alla specialtaggarna är av type="content"...

skumt!

263 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
123 ms — deklarationer (db)
0 ms — hämta statistik (cache)
135 ms — hämta tråd, inlägg och bilagor (db)
124 ms — ändringar (db)