php, preg_match, regex, извлекать определенный текст - PullRequest
0 голосов
/ 25 октября 2010

У меня очень большой файл .txt с заказом наших клиентов, и мне нужно переместить его в базу данных mysql.Однако я не знаю, какое регулярное выражение использовать в качестве информации, не сильно отличается.

-----------------------
4046904


KKKKKKKKKKK
Laura Meyer
MassMutual Life Insurance
153 Vadnais Street

Chicopee, MA 01020
US
413-744-5452
lmeyer@massmutual.co...


KKKKKKKKKKK
373074210772222 02/12 6213 NA
-----------------------
4046907


KKKKKKKKKKK
Venkat Talladivedula

6105 West 68th Street

Tulsa, OK 74131
US
9184472611
venkat.talladivedula...


KKKKKKKKKKK
373022121440000 06/11 9344 NA
-----------------------

Я пытался что-то, но я даже не мог извлечь имя ... вот пример моих усилий без успеха


$htmlContent = file_get_contents("orders.txt");

//print_r($htmlContent);

$pattern = "/KKKKKKKKKKK(.*)\n/s";
preg_match_all($pattern, $htmlContent, $matches);
print_r($matches);
$name = $matches[1][0];
echo $name;

Ответы [ 4 ]

4 голосов
/ 25 октября 2010

Вы можете избегать регулярных выражений для чего-то подобного. Поскольку данные четко организованы по линиям, вы можете многократно читать строки с помощью функции fgets () и таким образом анализировать данные.

0 голосов
/ 03 мая 2017

Для справки, вот регулярное выражение, которое захватит имена для вас. (Предоставленная скорость очень хорошо может быть проблемой.)

(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)

Пояснение:

(?<=K{10}\s{2})  #Positive lookbehind for KKKKKKKKKK then 2 return/newline characters
\K[^\r\n]++      #Greedily match 1 or more non-return/newline characters
(?!\s{2}-)       #Negative lookahead for return/newline character then dash

Вот демоверсия Regex .

Вы заметите, что мой шаблон регулярных выражений немного меняется между демонстрацией регулярных выражений и демонстрацией PHP. Для соответствия символам возврата / перевода строки может потребоваться небольшая настройка в зависимости от среды.

Вот реализация php ( Demo ):

if(preg_match_all("/(?<=K{10}\s{2})\K[^\r\n]++(?!\s{2}-)/",$htmlContent,$matches)){
    var_export($matches[0]);   
}else{
    echo "no matches";
}

Используя \K в моем паттерне, я избегаю необходимости заключать в скобки. Это сокращает размер массива на 50% и является полезным приемом для многих проектов. \K в основном гласит «начать совпадение полной строки с этой точки», поэтому совпадения идут в первом подрешетке (полные строки, ключ = 0) $matches вместо генерации совпадения полной строки в 0 и захвата в 1.

Вывод:

array (
  0 => 'Laura Meyer',
  1 => 'Venkat Talladivedula',
)
0 голосов
/ 25 октября 2010

Поскольку вы точно знаете, где находятся ваши данные (т.е. в какой строке они включены), почему бы просто не получить их таким образом?

т.е. что-то вроде

$htmlContent = file_get_contents("orders.txt");

$arrayofclients = explode("-----------------------",$htmlContent);
$newlinesep = "\r\n";
for($i = 0;i < count($arrayofclients);$i++)
{
$temp = explode($newlinesep,$arrayofclients[i]);
$idnum = $temp[0];
$name = $temp[4];
$houseandstreet = $temp[6];
//etc
}

или просто прочитайте файл построчно с помощью fgets () - что-то вроде:

$i = 0;$j = 0;
$file = fopen("orders.txt","r");
$clients = [];
while ($line = fgets($ffile) )
{
    if(line != false)
    {
        $i++;
        switch($i)
        {
        case 2:
            $clients[$j]["idnum"] = $line;
            break;
        case 6:
            $clients[$j]["name"] = $line;
            break;
        //add more cases here for each line up to:
        case 18:
            $j++;
            $i = 0;
            break;
        //there are 18 lines per client if i counted right, so increment $j and reset $i.
        }
    }
}
fclose ($f);

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

Nico

0 голосов
/ 25 октября 2010

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

Я рекомендую вам прочитать этот файл построчно и проанализировать каждый файл, чтобы определить, какие данные он содержит.

...