Помощь при разборе строк - PullRequest
0 голосов
/ 29 января 2010

У меня есть абзац текста в следующем формате:

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

Я хочу иметь возможность

1) Извлечь текст, найденный между каждым тегом <age> и <hobbies>, найденным в строке. Так, например, у меня будет массив с именем $ages, который будет содержать все возрасты, найденные между всеми тегами <age></age>, а затем еще один массив $hobbies, который будет содержать текст между тегами <hobbies></hobbies>, найденными по всей строке.

2) Уметь заменять извлеченные теги маркером, например {age_444}, например, приведенный выше текст станет

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

Как это можно сделать?

Ответы [ 3 ]

1 голос
/ 29 января 2010
//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 голосов
/ 29 января 2010

Если ваш исходный документ является своего рода правильно сформированным XML (или, по крайней мере, его можно легко привести в эту форму), вы можете использовать XSLT / XSL-FO для преобразования вашего документа.

Поиск информации, заключенной в теги <>, и переупорядочение / извлечение их - одна из основных функций. Вы можете использовать XSLT / XSL-FO отдельно или на разных языках (Java, C, даже Visual Basic)

Вам нужен исходный документ и документ, описывающий правила преобразования. Рендеринг или функция библиотеки сделают все остальное.

Надеюсь, это поможет. Удачи

0 голосов
/ 29 января 2010
$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];
}

финальные массивы - это хобби и $ ages

после этого вы просто заменяете жало следующим образом:

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);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...