2016-11-07 3 views
0

У меня есть файл, содержащий пары ключ/значение с случайным комментарием (разделенным символом ';'), который хочет проанализировать с помощью preg_match (или, может быть, preg_match - неправильный инструмент).preg_match regexp синтаксис, извлечение до;

файл выглядит следующим образом

key1 VALUE1 
    key2 VALUE2 ; comment 2 
    key3 VALUE3a VALUE3b 
    key4 VALUE4a VALUE4b ; comment 4 

(есть один или более пробелы в начале каждой строки)

Мой preg_match выглядит как этот preg_match('/\s*(\S+)\s+(.+)/', $line, $result); , правильно расщепляет линии «key1» и "ключ3". Для key2 и key4 «; комментарий #» становится частью $ result [2]. Возможно ли «удалить» часть «; comment» непосредственно в preg_match (меня не волнует, что часть «; комментарий» заканчивается в $ result [3].

+0

Вы можете использовать пару 'explode's в вашем случае.Сначала возьмите массив строк, затем взорвите обрезанную строку с помощью ';' или '"; "', затем получите первый элемент и «взорвите» на 2 части в первом пространстве. –

ответ

0

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

\s*(\S+)\s+([^;]+) 

see there

0

Вы можете использовать пару взрывов в ваш случай. во-первых, получить массив строк, а затем взорвать обрезанную строку с ; или " ; ", а затем получить первый элемент и взрываются в 2-х частей на первом пространстве.

$str = ' key1 VALUE1 
    key2 VALUE2 ; comment 2 
    key3 VALUE3a VALUE3b 
    key4 VALUE4a VALUE4b ; comment 4'; 
$lines = explode("\n", $str); 
$res = array(); 
foreach ($lines as $line) { 
    $t = explode(" ; ", trim($line)); 
    $ch = explode(" ", $t[0], 2); 
    $res[$ch[0]] = $ch[1]; 
} 
print_r($res); 

Смотрите PHP demo

Если вы предпочитаете регулярное выражение, вы можете использовать

preg_match_all('~^\h*(\w+)\h+([^;\n]+)~m', $str, $res); 

См. this PHP demo и regex demo.

Детали:

  • ^ - начало строки ^
  • \h* - ноль или более горизонтальные пробелы
  • (\w+) - Группа 1 захватывая один или несколько символов слов в группе 1 (вы можете использовать \S+, если могут быть символы, отличные от слов)
  • \h+ - один или несколько горизонтальных whitespa ces
  • ([^;\n]+) - Группа 2, захватывающая любые символы 1+, отличные от новой строки, и ;.
0

Попробуйте это, в основном, вам просто нужно PREG соответствовать все до первого ;.

Все, что стоит перед запятой, что вы хотите. Если запятая отсутствует, вы берете всю линию.

#!/usr/bin/php 
$txt = ' 
key1 VALUE1\n 
key2 VALUE2 ; comment 2\n 
key3 VALUE3a VALUE3b\n 
key4 VALUE4a VALUE4b ; comment 4\n'; 

foreach(explode('\n', $txt) as $line){ 
    preg_match('/(.*);.*/', $line, $group); 
    if(empty($group)){ 
     $result = $line;//no comma found so take whole line 
    }else{ 
     $result = $group[1];//comma found so take first matching. 
    } 
    echo $result."\n<br />"; 
} 

Напечатает:

key1 VALUE1 
key2 VALUE2 
key3 VALUE3a VALUE3b 
key4 VALUE4a VALUE4b 
Смежные вопросы