2010-07-28 4 views
0

Мне нужно извлечь "C: \ Documents и Settings" из последней строки этих данных:PHP Extract Line

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft 
ExcludeSubDirs REG_DWORD 0x1 
ExtensionList REG_SZ 
FirstAction   REG_DWORD 0x11 
ThreatName   REG_SZ   C:\Documents and Settings 
Owner   REG_DWORD 0x3 
ProtectionTechnolog REG_DWORD 0x1 
SecondAction REG_DWORD 0x11 
DirectoryName REG_SZ   C:\Documents and Settings 

Как я могу извлечь "C: \ Documents и Settings" или что-то значение несколько раз с использованием PHP?

+0

@David Замок: Как вы получить строку? Он может быть разделен символами новой строки, что упростит ситуацию. – Mike

+0

У вас есть эти данные в строке или вы пытаетесь вырвать ее из реестра? –

+0

Знаете ли вы имена ключей заранее? – NullUserException

ответ

1

Использовать регулярные выражения

$str = 'your string'; 
preg_match_all('!HKEY.+?DirectoryName\s+REG_SZ\s+([^\n]+)!s', $str."\nHKEY", $matches); 
$dirs = @array_map('trim', $matches[1]); 

Ваши матчи будут в $dirs массиве.
Вот рабочий пример: http://ideone.com/rdTOx

+0

Две звездочки на самом деле должны смело утверждать. Как я могу сделать это без звездочек? –

+0

@David Это не сильно изменится – NullUserException

+0

Отлично! Благодарю. –

0

Что-то, как это должно работать ...

$pattern = '#\*\*DirectoryName\s+REG_SZ\s+(.*?)\*\*#'; 
if (preg_match($pattern, $input, $output)) { 
    print_r($output); 
} 
+0

Я думаю, что вы хотите, это положительный lookbehind. Это проверяет, что имя каталога REG_SZ существует до согласованного текста, но не возвращает его в соответствие – Keyo

0

Если это на Windows, вы можете получить доступ к значению непосредственно через COM-интерфейс:

$WshShell = new COM("WScript.Shell"); 
$result = $WshShell->RegRead(
    'HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\DirectoryName'); 

echo $result; // C:\Documents and Settings 

выше предполагает, что есть на самом деле является одним из ключевых «DirectoryName» в данный должность.

И также этот класс (не могу сказать, если это ничего хорошего):

+0

Правильно, но мне нужно получить несколько DirectoryName, а не только один. –

+1

@ Давид не уверен, что понимаю. Просто измените ключ. – Gordon

+0

@ Gordon Я думаю, ему нужно собрать целую кучу. – NullUserException