2016-07-29 8 views
3

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

строка = "(731) some text here with number 2 (220) some 54 number other text here" конвертировать в:

array( 
    '731' => 'some text here with number 2', 
    '220' => 'some 54 number other text here' 
); 

Я попытался:

preg_split('/\([0-9]{3}\)/', $string); 

и получены:

array ( 
    0 => 'some text here', 
    1 => 'some other text here' 
); 
+0

Думаю, вы должны представить данные, о которых идет речь, в небольшом лучшем формате. Сообществу будет легче прочитать и ответить. –

+1

Требования слишком расплывчаты. Могли бы вы хотя бы предоставить ожидаемый результат для введенной строки ввода? –

+0

А может, вы уже пробовали себя? – syck

ответ

5

Код

$string = "(731) some text here with number 2 (220) some 54 number other text here"; 

preg_match_all("/\((\d{3})\) *([^(]*(?> +[^(]+)*)/", $string, $matches); 
$result = array_combine($matches[1], $matches[2]); 

var_dump($result); 

Выход

array(2) { 
    [731]=> 
    string(28) "some text here with number 2" 
    [220]=> 
    string(30) "some 54 number other text here" 
} 

ideone demo


Описание

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

  • \((\d{3})\), чтобы соответствовать 3 цифры в Па rentheses и захватывает его (группа 1)
  • \ *, чтобы соответствовать пробелов между ключами и значениями
  • ([^(]*(?> +[^(]+)*), чтобы соответствовать все, кроме ( и захватывает его (группа 2)
    Это подвыражению точно так же, как [^(]*(?<!) но более эффективно, на основе unrolling-the-loop technique.

    * Обратите внимание, что я интерпретирую поле значений не может иметь ( внутри. Если это не так, скажите, и я буду соответствующим образом изменять его.

После этого, мы имеем $matches[1] с ключами и $matches[2] со значениями. Используя array_combine(), мы сгенерируем нужный массив.

+0

Up-voted только для использования 'array_combine()'. Две проблемы с вашим RegEx: 1 - ненужные притяжательные квантификаторы. 2- Игнорирование скобок из строки (которая может быть там). – revo

+0

Почему вы думаете, что может быть случай сбоя для '\ s * +' и '[^ (] * +'? – revo

+0

Hah! Правильно! Не знаю, что я думал. Спасибо за хедз-ап – Mariano

1

Попробуйте это:

$string = "(731) some text here with number 2 (220) some 54 number other text here"; 
$a = preg_split('/\s(?=\()/', $string);//split by spaces preceding the left bracket 
$res = array(); 
foreach($a as $v){ 
    $r = preg_split('/(?<=\))\s/', $v);//split by spaces following the right bracket 
    if(isset($r[0]) && isset($r[1])){ 
     $res[trim($r[0],'() ')] = trim($r[1]);//trim brackets and spaces 
    } 
} 
print_r($res); 

Выход:

Array 
(
    [731] => some text here with number 2 
    [220] => some 54 number other text here 
) 

DEMO

Если вы хотите ограничить его только те числа в скобках, которые имеют 3 цифры, просто изменить lookarounds:

$a = preg_split('/\s(?=\([0-9]{3}\))/', $string); 
1

вы можете попробовать этот,

<?php 
$str="(731) some text here (220) some other text here"; 
echo $str .'<br>'; 
$arr1=explode('(', $str); 
$size_arr=count($arr1); 
$final_arr=array(); 
for($i=1;$i<$size_arr; $i++){ 
    $arr2=explode(')', $arr1[$i]); 
    $final_arr[$arr2[0]]=trim($arr2[1]); 
} 
echo '<pre>'; 
print_r($final_arr); 
?> 

Используйте эту ссылку, чтобы проверить код, Click Here.

Я пытаюсь использовать простой синтаксис. Надеюсь, все поймут.

1

Возможно, вы можете добавить PREG_SPLIT_DELIM_CAPTURE флаг в preg_split. От preg_split страницы человека (http://php.net/manual/en/function.preg-split.php)

PREG_SPLIT_DELIM_CAPTURE

Если этот флаг установлен, выражение в скобках в разделяющем шаблоне будет захвачено и возвращено, а также.

Так что, если вы измените свой код:

$results = preg_split('/\(([0-9]+)\)/s', $data,null,PREG_SPLIT_DELIM_CAPTURE); 

Вы получите массив, похожий на:

Array 
(
    [0] => KS/M/ 2013/1238 
    [1] => 220 
    [2] => 23/12/2013 
    [3] => 300 
    [4] => 

    [5] => 731 
    [6] => VALDETE BUZA ADEM JASHARI- PRIZREN, KS 
    [7] => 526 
    [8] => 

    [9] => 591 
    [10] => 

    [11] => 740 
    [12] => 


    [13] => 540 
    [14] => DEINA 
    [15] => 546 
    [16] => 


    [17] => 511 
    [18] => 3 Preparatet për zbardhim dhe substancat tjera për larje rrobash; preparatet për pastrim, shkëlqim, fërkim dhe gërryerje; sapunët; parfumet, vajrat esencialë, preparatet kozmetike, losionet për flokë, pasta për dhembe 
14 Metalet e cmueshme dhe aliazhet e tyre; mallrat në metale të cmueshme ose të veshura me to, që nuk janë përfshire në klasat tjera; xhevahirët, gurët e cmueshëm; instrumentet horologjike dhe kronometrike (për matjen dhe regjistrimin e kohës) 
25 Rrobat, këpucët, kapelat 
35 Reklamim, menaxhim biznesi; administrim biznesi; funksione zyre 
) 

Что вы должны сделать, это перебрать массив, игнорируя первый элемент в этом случае:

$myArray = array(); 
$myKey = ''; 
foreach ($results as $k => $v) { 
    if (($k > 0) && ($myKey == '')) { 
    $myKey = $v; 
    } else if ($k > 0) { 
    $myArray[$myKey] = $v; 
    $myKey = ''; 
    } 
} 

EDIT: Этот ответ для:

$data ='KS/M/ 2013/1238 (220) 23/12/2013 (300) 
(731) VALDETE BUZA ADEM JASHARI- PRIZREN, KS (526) 
(591) 
(740) 

(540) DEINA (546) 

(511) 3 Preparatet për zbardhim dhe substancat tjera për larje rrobash; preparatet për pastrim, shkëlqim, fërkim dhe gërryerje; sapunët; parfumet, vajrat esencialë, preparatet kozmetike, losionet për flokë, pasta për dhembe 
14 Metalet e cmueshme dhe aliazhet e tyre; mallrat në metale të cmueshme ose të veshura me to, që nuk janë përfshire në klasat tjera; xhevahirët, gurët e cmueshëm; instrumentet horologjike dhe kronometrike (për matjen dhe regjistrimin e kohës) 
25 Rrobat, këpucët, kapelat 
35 Reklamim, menaxhim biznesi; administrim biznesi; funksione zyre'; 
1

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

preg_match_all("/(\()([0-9]*)(\))\s/", $input_lines, $output_array); 

вы найдете ключи в $ output_array [2]. И один для текстов (что выглядит совсем то же самое):

preg_split("/(\()([0-9]*)(\))\s/", $input_line); 

После этого, вы можете создать свой собственный массив итерация обоих. Обязательно обрезать строки во втором массиве при вставке.

1

Использование preg_replace_callback() вы можете быстро достичь того, чего вы хотите (если только круглые скобки содержат 3 цифры):

$string = "(731) some text here with number 2 (220) some 54 number other text here"; 
$array = array(); 
preg_replace_callback('~(\((\d{3})\))(.*?)(?=(?1)|\Z)~s', function($match) use (&$array) { 
    $array[$match[2]] = trim($match[3]); 
}, $string); 
var_dump($array); 

Выход:

array(2) { 
    [731]=> 
    string(28) "some text here with number 2" 
    [220]=> 
    string(30) "some 54 number other text here" 
} 
Смежные вопросы