2010-08-18 4 views
0

я в настоящее время есть следующий код:PHP ассоциативные массивы, регулярное выражение, массив

$content = " 
<name>Manufacturer</name><value>John Deere</value><name>Year</name><value>2001</value><name>Location</name><value>NSW</value><name>Hours</name><value>6320</value>"; 

мне нужно найти способ, чтобы создать и массив как name=>value. Например, Manufacturer => John Deere.

Может кто-нибудь помочь мне с простым кодом отрезал я пробовал некоторые регулярные выражения, но даже не работаю, чтобы извлечь имена или значение, например .:

$pattern = "/<name>Manufacturer<\/name><value>(.*)<\/value>/"; 
preg_match_all($pattern, $content, $matches); 
$st_selval = $matches[1][0]; 

ответ

3

Я использую свой $content переменную:

$preg1 = preg_match_all('#<name>([^<]+)#', $content, $name_arr); 
$preg2 = preg_match_all('#<value>([^<]+)#', $content, $val_arr); 
$array = array_combine($name_arr[1], $val_arr[1]); 
+0

быстро и просто :) спасибо большое! – Michael

5

Вы не хотите использовать регулярное выражение для этого. Попробуйте что-то вроде SimpleXML

EDIT
Ну, почему бы вам не начать с этого:

<?php 

$content = "<root>" . $content . "</root>"; 
$xml = new SimpleXMLElement($c); 
print_r($xml); 

?> 

EDIT 2
Несмотря на то, что некоторые из ответов, размещенных с использованием регулярных выражений МОЖЕТ работать, вы должны привыкнуть использовать правильный инструмент для задания, а регулярные выражения не являются правильным инструментом для синтаксического анализа XML.

+0

ok, но как связать результаты в одном массиве? – Michael

+0

также содержимое не похоже на xml, поэтому я получаю какие-то ошибки, такие как SimpleXMLElement :: __ construct() [simplexmlelement .-- construct]: Entity: строка 3: ошибка парсера: дополнительный контент в конце документ в C: \ wamp \ www \ index.php в строке 13 – Michael

+0

Это не похоже на «real world xml», это всего лишь последовательность тегов. –

0

Я буду редактировать, так как мой PHP ошибочен, но вот какой-то PHP (псевдо) код, чтобы дать какое-то направление.

$pattern = '|<name>([^<]*)</name>\s*<value>([^<]*)</value>|' 
preg_match_all($pattern, $content, $matches, PREG_SET_ORDER); 
for($i = 0; $i < count($matches); $i++) { 
    $arr[$matches[$i][1]] = $matches[$i][2]; 
} 

$arr это массив вы хотите сохранить пары имя/значение.

1

Прежде всего, никогда не использовать regex to parse xml ...

Вы можете сделать это с помощью запроса XPATH ...

Во-первых, обернуть содержимое в корневой тег, чтобы сделать анализатор счастливым (если он еще не имеет его):

$content = '<root>' . $content . '</root>'; 

Затем загрузите документ

$dom = new DomDocument(); 
$dom->loadXml($content); 

Затем инициализировать XPATH

$xpath = new DomXpath($dom); 

Написать свой запрос:

$xpathQuery = '//name[text()="Manufacturer"]/follwing-sibling::value/text()'; 

Затем выполните его:

$manufacturer = $xpath->evaluate($xpathQuery); 

Если я право XPATH, это $manufacturer должно быть John Deere .. .

Документы можно посмотреть по адресу DomXpath, basic primer on XPath и a bunch of XPath examples ...

Edit: Это не будет работать (PHP не поддерживает этот синтаксис (следующий-родственный).Вы могли бы сделать это вместо запроса XPATH:

$xpathQuery = '//name[text()="Manufacturer"]'; 
$elements = $xpath->query($xpathQuery); 
$manufacturer = $elements->item(0)->nextSibling->nodeValue; 
+0

В статье фактически сказано, что для простых строк можно использовать регулярное выражение. – palswim

+0

К сожалению, он не работает. Предупреждение: domdocument :: domdocument() ожидает как минимум 1 параметр, 0 задан в C: \ wamp \ www \ index.php в строке 7 Неустранимая ошибка: вызов неопределенного метода domdocument :: loadXml() в C: \ wamp \ www \ index.php в строке 8 – Michael

+1

Какую версию PHP вы используете? 4? И нет, ИМХО, никогда не использовать регулярное выражение даже для простых строк xml. Это похоже на то, что хорошо использовать 'goto' для простых вещей ... – ircmaxell

2

Это довольно просто, может быть решена с помощью регулярных выражений. Должно быть:

$name = '<name>\s*([^<]+)</name>\s*'; 
$value = '<value>\s*([^<]+)</value>\s*'; 

$pattern = "|$name $value|"; 
preg_match_all($pattern, $content, $matches); 

# create hash 
$stuff = array_combine($matches[1], $matches[2]); 

# display 
var_dump($stuff); 

С уважением

БВУ

0

Использование XMLReader:

$content = '<name>Manufacturer</name><value>John Deere</value><name>Year</name><value>2001</value><name>Location</name><value>NSW</value><name>Hours</name><value>6320</value>'; 
$content = '<content>' . $content . '</content>'; 
$output = array(); 

$reader = new XMLReader(); 
$reader->XML($content); 
$currentKey = null; 
$currentValue = null; 
while ($reader->read()) { 
    switch ($reader->name) { 
     case 'name': 
      $reader->read(); 
      $currentKey = $reader->value; 
      $reader->read(); 
      break; 
     case 'value': 
      $reader->read(); 
      $currentValue = $reader->value; 
      $reader->read(); 
      break; 
    } 
    if (isset($currentKey) && isset($currentValue)) { 
     $output[$currentKey] = $currentValue; 
     $currentKey = null; 
     $currentValue = null; 
    } 
} 

print_r($output); 

Выход является:

Array 
(
    [Manufacturer] => John Deere 
    [Year] => 2001 
    [Location] => NSW 
    [Hours] => 6320 
) 
1

Я думаю, что это то, что вы ищете:

<?php 
$content = "<name>Manufacturer</name><value>John Deere</value><name>Year</name><value>2001</value><name>Location</name><value>NSW</value><name>Hours</name><value>6320</value>"; 
$pattern = "(\<name\>(\w*)\<\/name\>\<value\>(\w*)\<\/value\>)"; 
preg_match_all($pattern, $content, $matches); 

$arr = array(); 

for ($i=0; $i<count($matches); $i++){ 
    $arr[$matches[1][$i]] = $matches[2][$i];  
} 

/* This is an example on how to use it */ 
echo "Location: " . $arr["Location"] . "<br><br>"; 

/* This is the array */ 
print_r($arr); 

>

Если массив имеет много элементов не использовать функцию подсчета() в? for loop, сначала вычислите значение, а затем используйте его как константу.

Смежные вопросы