2016-07-29 15 views
3

Ich brauche die Zeichenfolge unten in Array-Schlüssel wie in diesem Format zu spalten:Split-String in Array regex php

string = "(731) some text here with number 2 (220) some 54 number other text here" umwandeln in:

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

Ich habe versucht:

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

und erhalten:

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

Ich denke, Sie sollten die fraglichen Daten in etwas besserem Format darstellen. Es wird leichter für die Community sein, es zu lesen und zu antworten. –

+1

Die Anforderungen sind zu vage. Könnten Sie zumindest die erwartete Ausgabe für die angegebene Eingabezeichenfolge bereitstellen? –

+0

Und vielleicht, was hast du bis jetzt versucht? – syck

Antwort

5

-Code

$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); 

Ausgang

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

ideone demo


Beschreibung

Die regex verwendet

  • \((\d{3})\) 3 Ziffern in pa übereinstimmen rentheses und fängt es (Gruppe 1)
  • \ * die Räume zwischen den Tasten entsprechen und Werte
  • ([^(]*(?> +[^(]+)*) alles passen außer einem ( und fängt es (Gruppe 2)
    Dieses Unter-Pattern entspricht genau der gleiche wie [^(]*(?<!) aber effizienter, basierend auf der unrolling-the-loop technique.

    * Beachten Sie, dass ich ein Wertfeld interpretieren kann kein ( innerhalb haben. Wenn das nicht der Fall ist, sag es und ich werde es entsprechend ändern.

Danach haben wir $matches[1] mit Tasten und $matches[2] mit Werten. Unter Verwendung von array_combine() erzeugen wir das gewünschte Array.

+0

zur Verfügung gestellt nur für die Verwendung von 'array_combine()'. Zwei Probleme mit Ihrer RegEx: 1- Unnötige Possessivquantifizierer. 2- Das Ignorieren von Klammern aus Strings (die dort sein können). – revo

+0

Warum sollten Sie denken, dass es einen Fehlerfall für '\ s * +' und '[^ (] * +' geben könnte? – revo

+0

Hah! Richtig! Keine Ahnung, was ich dachte. Danke für das Heads-up – Mariano

1

Versuchen Sie folgendes:

$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); 

Ausgang:

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

DEMO

Wenn Sie es nur auf diese Zahlen in Klammern begrenzen möchten, die drei Ziffern haben, ändern Sie einfach die lookarounds:

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

können Sie dieses versuchen,

<?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); 
?> 

Verwenden Sie diesen Link, um den Code zu testen, Click Here.

Ich versuche, die einfache Syntax zu verwenden. Hoffe, dass jeder verstehen kann.

1

Vielleicht können Sie PREG_SPLIT_DELIM_CAPTURE Flag zu preg_split hinzufügen. Von preg_split Manpage (http://php.net/manual/en/function.preg-split.php)

PREG_SPLIT_DELIM_CAPTURE

Wenn dieser Flag gesetzt ist, wird in Klammern stehende Ausdruck im Begrenzungsmuster als gut eingefangen und zurückgeführt wird.

Also, wenn Sie Ihren Code ändern:

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

Sie werden eine Reihe ähnlich erhalten:

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 
) 

Was Sie tun sollten, ist über das Array Schleife erste Element ignoriert in dieser Fall:

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

EDIT: Diese Antwort ist für:

$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

Ich bin ziemlich sicher, dass die Schlüssel definieren, nicht möglich ist, wie die Regex Streichhölzer coninuously hinzufügen. Ich würde definieren 2 regex, eine für die Tasten:

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

Sie Ihre Schlüssel in $ output_array finden [2]. und eine für die Texte (das sieht ganz gleich):

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

Danach werden Sie Ihre benutzerdefinierten Array iterieren beide aufbauen können. Achten Sie darauf, die Strings im zweiten Array beim Einfügen zu trimmen.

1

Mit preg_replace_callback() können Sie schnell erreichen, was Sie sich wünschen (wenn nur Klammern enthalten 3-stellig):

$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); 

Ausgang:

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