2010-01-29 123 views
0

我有文字的格式如下段落:字符串解析幫助

text text text <age>23</age>. text text <hobbies>...</hobbies> 

我希望能夠

1)提取字符串中找到的每個<age><hobbies>標籤之間的文本。例如,我將有一個名爲$ages的數組,其中將包含所有<age></age>標記之間發現的所有年齡段,然後是另一個數組$hobbies,其中將在整個字符串中找到<hobbies></hobbies>標記之間的文本。

2)能夠取代它與一個標記中提取的標籤,如{} age_444,所以e.g上面的文字將成爲

text text text {age_444}. text text {hobbies_555} 

如何才能做到這一點?

+1

23怎麼會變成444和...變成555? – YOU 2010-01-29 11:01:45

+0

@s標記,我會在我的'年齡'表中存儲'23',它會得到444的ageId,因此我會放入{age_444},同樣的業餘愛好 – 2010-01-29 11:03:46

回答

1
//Extract the age 
preg_match_all("#<age>(.*?)</age>#",$string,$match); 
$ages=$match[1]; 
//Extract the hobby 
preg_match_all("#<hobbies>(.*?)</hobbies>#",$string,$match); 
$hobbies=$match[1]; 

//Replace the age 
$agefn=create_function('$match','$query=mysql_query("select ageid...where age=".$match[1]); return "<age>{age_".mysql_fetch_object($query)->ageid."}</age>"'); 
$string=preg_replace_callback("#<age>(.*?)</age>#",$agefn,$string); 

//Replace the hobby 
$hobfn=create_function('$match','$query=mysql_query("select hobid...where hobby=".$match[1]); return "<hobbies>{hobbies_".mysql_fetch_object($query)->hobid."}</hobbies>"'); 
$string=preg_replace_callback("#<hobbies>(.*?)</hobbies>#",$hobfn,$string); 
+0

很好的答案,但我不能使用create_function部分。另外我的代碼,以獲得年齡等id將大不相同。有沒有其他方法可以取代年齡?我寧願在循環$ ages/$ hobbies時可以檢索年齡/愛好的角色位置,因此我可以使用substr_replace()替換年齡/愛好 – 2010-01-29 11:22:56

+0

您可以將PREG_OFFSET_CAPTURE標誌設置爲preg_match_all以獲得該指數。無論如何,你爲什麼不能使用create_function? – mck89 2010-01-29 11:29:39

+0

如果你已經準備了年齡和愛好的函數而不是create_function,寫下他們的名字 – mck89 2010-01-29 11:31:10

-1
$string = '<age>23</age><hobbies>hobbietext</hobbies>'; 

$ageTemp = explode('<age>', $string); 
foreach($ageTemp as $key=>$value) 
{ 
    $age = explode('</age>', $value); 
    if(isset($age[0])) $ages[] = $age[0]; 
} 

$hobbiesTemp = explode('<hobbies>', $string); 
foreach($hobbiesTemp as $key=>$value) 
{ 
    $hobbie = explode('</hobbies>', $value); 
    if(isset($hobbie[0])) $hobbies[] = $hobbie[0]; 
} 

最終陣列$愛好和$年齡後

您只需更換你的刺是這樣的:

foreach($ages as $key=>$value) 
{ 
    $string = str_replace('<age>'.$value.'</age>', '{age_'.$yourId.'}', $string); 
} 

foreach($hobbies as $key=>$value) 
{ 
    $string = str_replace('<hobbies>'.$value.'</hobbies>', '{hobbie_'.$yourId.'}', $string); 
} 
0

如果源文件是一種形成良好XML(或者至少可以輕鬆地將其引入此形狀),則可以使用XSLT/XSL-FO來轉換文檔。

查找包含在<>標記中的信息並重新排列/提取它們是主要功能之一。您可以單獨使用或以各種語言(Java,C,甚至是Visual Basic)使用XSLT/XSL-FO

您需要的是您的源文檔和描述轉換規則的文檔。渲染機器或庫函數將完成剩下的工作。

希望有所幫助。祝你好運