2014-12-23 5 views
0

Я пытаюсь извлечь и присвоить значениям генерального директора, председателя и любых других ключевых позиций отдельным переменным. Мне было интересно, как это можно сделать и какой лучший способ использовать. Пожалуйста, см. Мой код ниже, который имеет переменную $ keypeople, но я хотел бы, чтобы это было дополнительно разбито на переменные $ CEO; $ Председатель и т. Д. В зависимости от ролей, содержащихся в $ keypeople. В приведенном ниже примере переменная $ keypeople возвращает следующую строку:Извлечь определенные значения из строки в виде отдельных переменных

key_people = {{unbulleted list|[[Larry Page]] ([[CEO]])|[[Eric Schmidt]] ([[Chairman]])|[[Sergey Brin]] (Director of [[Google X]] and Special Projects){{cite web|url=https://www.google.co.uk/intl/en/about/company/facts/management/ |title=Management Team - Company - Google}}}} 

Любая помощь в высоко оцененном.

<html> 
<body> 
<h2>Search</h2> 
<form method="post"> 
Search: <input type="text" name="q" value="Google"/> 
<input type="submit" value="Submit"> 
</form> 

<?php 
if (isset($_POST['q'])) { 
$search = $_POST['q']; 
$search = ucwords($search); 
$search = str_replace(' ', '_', $search); 
$url_2 = "http://en.wikipedia.org/w/api.php? 
action=query&prop=revisions&rvprop=content&format= 
json&titles=$search&rvsection=0&continue="; 
$res_2 = file_get_contents($url_2); 
$data_2 = json_decode($res_2); 

?> 

<h2>Search results for '<?php echo $search; ?>'</h2> 

<?php foreach ($data_2->query->pages as $r): 

?> 


<?php foreach($r->revisions[0] as $a); 

if (preg_match_all('/key_people += (.*)/', $a, $result)) { 

$keypeople = trim($result[0][0]); 

echo $keypeople; 
} else { 
echo 'Not found'; 
} 

?> 

<?php endforeach; 

?> 

<?php 
} 
?> 

</body> 
</html> 
+0

Если вы получили JSON, почему вы используете preg_match? Oo –

+0

Как выглядит '$ keyleople'? Можете ли вы урезать свой вопрос до всего лишь кода, который связан с этим? – Barmar

+0

Вместо отдельных переменных, почему бы вам не извлечь данные в ассоциативный массив? – Barmar

ответ

1
$people = array(); 
$split = explode('|', $keypeople); 
foreach ($split as $str) { 
    if (preg_match('/\[\[([^]]+)\]\] \(([^)]+)\)/', $str, $match)) { 
     $people[str_replace(array('[[', ']]'), '', $match[2])] = $match[1]; 
    } 
} 
var_dump($people); 

Регулярное выражение соответствует любому с шаблоном [[name]] (role).

Выход:

array(3) { 
    ["CEO"]=> 
    string(10) "Larry Page" 
    ["Chairman"]=> 
    string(12) "Eric Schmidt" 
    ["Director of Google X and Special Projects"]=> 
    string(11) "Sergey Brin" 
} 
+0

спасибо очень просто маленькая вещь, однако, CEO должен быть Ларри Пейдж, а председателем должен быть Эрик Шмидт, также есть ли надежный способ для этого, чтобы строка $ keypeople содержала другие роли, например, режиссер и т. Д.? – Oroku

+0

Я неправильно понял формат строки, я исправил свой код. Где в моем ответе я сделал это только для поиска этих двух ролей? – Barmar

+0

да это работает! Огромное спасибо. Да, я хотел бы посмотреть на все значение строки, то есть в случае, если $ keypeople содержит больше одного или двух значений, мне бы хотелось, чтобы все роли и все люди, соответствующие этим ролям, были возвращены. В этом случае, например, строка содержит Сергея Брина]] (Директор [Google X]] и специальных проектов. Как настроить код для размещения всех ролей и людей? – Oroku