Как извлечь подстроку из строки, имеющей переменную длину символа в PHP? - PullRequest
3 голосов
/ 09 апреля 2010

У меня есть некоторые данные в формате

C222 = 50
C1234P687 = 'some text'
C123YYY = 'text'
C444 = 89
C345 = 3
C122P687 = 'some text'
C122YYY = 'text'
....
....

так в основном 3 разные формы

  1. "C" число = значение, пример - C444 = 89
  2. «C» число «P» число = значение, пример - C123P687 = «некоторый текст»
  3. "C" число "YYY" = значение

Только число имеет переменную длину слева от знака (=). Значения варьируются.

Я хочу сохранить данные в БД как

INSERT INTO datatable 
    c_id = "number after C"
    p_id = "number after P" // if it exists for a line of data
    value = 'value'
    yyy = 'value'

Есть идеи, как получить эти цифры?

Спасибо

Ответы [ 3 ]

5 голосов
/ 09 апреля 2010

Используйте регулярные выражения в PHP. Следующий шаблон регулярного выражения будет соответствовать всем предоставленным вами случаям - используйте его с preg_match_all (передача в массив и PREG_SET_ORDER), и переданный вами массив будет содержать массив для каждой строки ваших данных , и массив каждой строки будет содержать 5 элементов.

(C[\d]+)(P[\d]+)?(YYY)? = (.+)

Первый элемент массива будет содержать всю протестированную строку.

Второй элемент массива будет содержать число «C».

Третий элемент массива будет содержать число "P", если оно присутствует, иначе оно будет пустым.

Четвертый элемент массива будет содержать «YYY», если он присутствует, в противном случае он будет пустым.

Пятый элемент массива будет содержать значение.

В ответ на более ранний комментарий следующее регулярное выражение является модифицированной версией вышеупомянутого, но не будет включать C и P в соответствующие значения:

C([\d]+)(?:P([\d]+))?(YYY)? = (.+)

3 голосов
/ 09 апреля 2010

Я предполагаю, что данные считываются из файла, поэтому используется что-то вроде file_get_contents или fopen.

Для данных регулярных выражений вам лучше всего ставить ..

Взгляните на http://php.net/manual/en/function.preg-match-all.php

# UPDATE REG EX UPDATED
preg_match_all("|C([\d]+)(?:P([\d]+))?(YYY)? = (.+)|", $yourDataLine, $out, PREG_SET_ORDER);

$out[0] = TESTED STRING e.g. C123 = 456;    
$out[1] = C;
$out[2] = P;
$out[3] = YYY;
$out[4] = VALUE;

reg выражение благодаря: Энди Шеллам

1 голос
/ 09 апреля 2010

Решение без использования регулярных выражений:

<?php

$s="C23YYY = 'hello world'";

$p1=explode('=',$s);

$left=trim($p1[0]);
$right=trim($p1[1]);

$value=$right;

if(substr($left,-3)!='YYY'){
    $pos=strpos($left,'P');
    if($pos!==false){
        $c_id=substr($left,1,$pos-1);
        $p_id=substr($left,1+$pos-strlen($left));
    }else{
        $c_id=substr($left,1-strlen($left));
    }
}else{
    $c_id=substr($left,1,strlen($left)-4);
    $yyy='YYY';
}

print("c_id = $c_id <br/>");
print("p_id = $p_id <br/>");
print("value = $value <br/>");
print("yyy = $yyy <br/>");

?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...