- PHP

2009-10-03 5 views
0

내가이 매우 큰 문자열 도움이 필요- PHP

[더 나은 설명에 대한 나의 EDIT 확인]. 이 같은

그것을 : 없음 브레이크 선으로

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#"; 

그것을하지만 공백으로. 우리는 이것이 좋은 모습을 가지고가는 경우에

, 그들은이 문자열은 다음과 같습니다

$splited_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#"; 

나는이에 대한 $big_string에서 검색 할 preg_split 필요하다고 생각 :

TinteiroID:[only numbers]#TinteiroLABEL:[any character, except "#"]#TinteiroREF:[any character, except "#"]#TinteiroMARCA:[any character, except "#"]#TinteiroGENERO:[any character, except "#"]#TinteiroQUANTIDADE:[only numbers]#FIMPROD# 

내가 가진 줄무늬는 $splited_string이고 대괄호 안에는 어떤 문자가 있는지 인용 할 수 있습니다.

[] 대괄호 대신에 받아 들여야하는 각 문자 유형에 대한 RegExpression 토큰이어야합니다. 하지만 이것에 대해서는 거의 알지 못합니다.

$splited_string을 배열 $array에 저장하십시오.

아무도 단서를 줄 수 있습니까?

감사

편집 : 내 논리를 설명하려고

.

TinteiroID : 1 #

TinteiroLABEL : HP CB335EE 번호

TinteiroREF : CB335EE 번호

TinteiroMARCA : HP

나는 (NO 브레이크 라인)이 큰 문자열을 #

TinteiroGENERO : 검정 잉크 카트리지 재활용 #

TinteiroQUANTIDADE : 23 #

FIMPROD 번호


TinteiroID : 4 #

TinteiroLABEL : HP 51,633 M #

TinteiroREF : 51,633 M #

TinteiroMARCA : HP 번호

TinteiroGENERO : 검정 잉크 카트리지 재활용 #

TinteiroQUANTIDADE : 12 #

FIMPROD 번호

그들은 두 개의 작은 문자열로 분할 할 수 있습니다. 레그 분할로

은 내가 모두이 사람을 보면 각 splited 문자열을 할당하고 싶었지만 다른 값 :

Array 
(
    [0] => TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD# 
    [1] => TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD# 
) 

:

TinteiroID:[only numbers]# 

TinteiroLABEL:[any character, except "#"]# 

TinteiroREF:[any character, except "#"]# 

TinteiroMARCA:[any character, except "#"]# 

TinteiroGENERO:[any character, except "#"]# 

TinteiroQUANTIDADE:[only numbers]# 

FIMPROD# 

그런 다음 배열에 각 splited 문자열을 추가 다음 각 for 루프는 배열의 모든 객체에이 갈 것입니다. 다른 RegExpression에서 [0] [1] ...

는 값을 수집하고 그 값으로 뭔가를 할 수 있습니다.

: 조언에 따라

:

예는 "지저분한"하고는 많은 CPU 걸리지 만 .. 나는 더 좋은 생각이 없습니다 : S


편집을

$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#";CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#"; 
$array = explode("FIMPROD#", $big_string); 

print_r ($array); 
:

이 코드를했던 것 691,363,210

는 각각 "#의 FIMPROD"각각의 구분의 끝에있는에 big_string을 분할합니다.

는 이제 배열에 가서, 거기에 각각의 값을 가지고있다. 그것으로 무언가를.

나는 그것을 지금 시도 할 것이다. 나는 그럭저럭 할 수있는 일을 게시 할 것이다.

+0

나에게 좋을 것 같습니다. 가장 간단한 방법이 가장 좋습니다. – pavium

답변

1

왜 정규식이 필요합니까? 두 번 나누면 어떨까요? 각 반복에서 여기

$num = 6;   # number of elements to in each splited_string 
$out = array(); 
foreach ($explode('#', $big_string) as $str) { 
    $tmp = explode(':', $str, 2); 
    if (count($tmp) == 2) { 
     $out[] = $tmp[1]; 
    } 
} 
$subs = intval(count($out)/$num); # how many splited_strings in the big string 
for ($i=0; $i<$sub; $i+$num) { 
    $each_id = array_slice($out, $i, $i+$num); # contains six strings 
} 

, $each_id 여섯 문자열을 포함하는 것입니다, 당신은 여전히 ​​정수로 처음과 마지막 요소를 변환해야 할 것입니다.

+0

이번에는 2, 유사한 문자열이 있기 때문에 다른 경우에는 4, 5, ... 등이 될 수 있습니다. –

+0

그래서, 뭐라구? 구문 분석 할 항목 수를 계산할 수 없습니까? – SilentGhost

+0

그걸로 도울 수 있니? 나는 그런 코드를 한 적이 없어. –

1

이는 수행해야합니다. 나는 내가 preg_split 3 개 결과를받을 수 있나요

"~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i" 
0

을, 2가 있어야하는 동안?

값이없는가요?

<?php 
$big_string = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#"; 
$array = preg_split("~TinteiroID:(\d+)#TinteiroLABEL:([^#]+)#TinteiroREF:([^#]+)#TinteiroMARCA:([^#]+)#TinteiroGENERO:([^#]+)#TinteiroQUANTIDADE:(\d+)#FIMPROD#~i", $big_string); 
print_r ($array); 
?> 

출력 :

Array 
(
    [0] => 
    [1] => 
    [2] => 
) 
+0

preg_split 대신 preg_match_all을 사용하십시오. –

1
preg_split()를 사용의 어려움은 두 개의 서로 다른 표현에 의해 분할 될 문자열을 필요로하는 것이다

: \d+[^#]+

은 당신이해야한다고 생각 문자열을 작은 숫자로 개로 나눈 다음 다시 함께 묶는 것을 고려하십시오.

하나의 preg_split()을 사용하여 분할을 시도하면 더 큰 문제가 발생합니다.

왼쪽 및 오른쪽으로 스크롤해야하기 때문에 전체 문자열을보기가 어렵습니다.

편집 : 예, Silent Ghost가 [^#]+이라는 정규식으로 분리하지 않는다고 말하면 실제로 분할하거나 # 문자로 더 잘 분해해야합니다.

그런 다음 배열을 두 개 이상의 작은 문자열로 다시 묶을 수 있습니다. 각 문자열의 첫 번째 요소로 'TinteiroID'를 확인하는 것이 좋습니다.

+0

나는 더 나은 formated 하나를 게시 할 것입니다 .. 잠깐. –

1

아래 코드를 사용해보십시오.

<?php 
    $str = "TinteiroID:1#TinteiroLABEL:HP CB335EE#TinteiroREF:CB335EE#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:23#FIMPROD#TinteiroID:4#TinteiroLABEL:HP 51633 M#TinteiroREF:51633 M#TinteiroMARCA:HP#TinteiroGENERO:Tinteiro Preto Reciclado#TinteiroQUANTIDADE:12#FIMPROD#"; 
    preg_match_all("/([A-Za-z]+)\:([^#]+)/", $str, $matches); 
    print_r($matches); 
    ?> 

는 당신은 문자열을 배열로 변환하는 preg_match_all 기능을 하나의 정규 표현식 /([A-Za-z]+)\:([^#]+)/이 필요합니다. 그러나 그것이 필요한 것인지 확실하지 않습니다.

online PHP regular expression tester이 도움을 드릴 것입니다.

+0

아주 좋습니다. 이것으로 2 개의 대답을 받아 들일 것입니다. –