PDA

View Full Version : حرفه ای: مشکل در استفاده از Regex



r0ot$harp
دوشنبه 10 تیر 1392, 09:57 صبح
سلام دوستان

من یه Regex نوشتم که به مشکل خورده. هرکاری کردم درست نشد. مشکلم اینه که مقدار هایی رو که می خوام بگیرم رو بهم می دم اما کل متن رو هم تو آرایه 0 برمیگردونه:


$str='HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END';
$pattern = '/^CLIENT_LIST,(.*),(.*),(.*),(.*),(.*),(.*),(.*)$/mi';
preg_match_all($pattern,$str,$matches);
print_r($matches);

من فقط می خوام این مقدار ها برگرده:
Ghae2semi
33:30
2
2
10272
Sun Jun 30 06:47:20 2013
13729240

باتشکر

MMSHFE
دوشنبه 10 تیر 1392, 11:29 صبح
<?php
$str = 'HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END';
$pattern = '#^CLIENT_LIST,(.*)$#im';
if(preg_match_all($pattern, $str, $matches)) {
foreach($matches[1] as $match) {
echo '<pre>' . print_r(explode(',', $match), true) . '</pre>' . PHP_EOL;
}
}
?>

r0ot$harp
دوشنبه 10 تیر 1392, 11:39 صبح
<?php
$str = 'HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END';
$pattern = '#^CLIENT_LIST,(.*)$#im';
if(preg_match_all($pattern, $str, $matches)) {
foreach($matches[1] as $match) {
echo '<pre>' . print_r(explode(',', $match), true) . '</pre>' . PHP_EOL;
}
}
?>



تشکر دوست عزیز

با match_all نمی شه نوشت؟؟؟
دوست عزیز اصلا راهی نداره که از foreach استفاده نکنیم؟؟؟ چون از این مقدار نزدیک به 10000 خط هست. این نمونه بود. می خوام regex خودم درست بشه.
باتشکر احسان

MMSHFE
دوشنبه 10 تیر 1392, 12:47 عصر
<?php
$str = 'HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END';
$pattern = '#^CLIENT_LIST,(.*)$#m';
if(preg_match_all($pattern, $str, $matches)) {
$pattern = '#([^,]+)#m';
if(preg_match_all($pattern, $matches[1][0], $matches)) {
echo '<pre>' . print_r($matches[1], true) . '</pre>' . PHP_EOL;
}
}
?>

r0ot$harp
دوشنبه 10 تیر 1392, 13:07 عصر
تشکر دوست عزیز

عالی بود

سوال من اینه که نمی شه از همون Regex خودم با یدونه Match_all استفاده کرد؟؟؟؟ چرا تو آرایه 0 کل خط رو میاره؟؟؟ نمی شه اون رو حذف کرد؟؟؟؟


متن:
HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)

CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
CLIENT_LIST,dqwdqdxsadas,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
CLIENT_LIST,dwq1,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END

پاسخ با اجرا #^CLIENT_LIST,(.*)$#m:


Array ( [0] => Array ( [0] => CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 [1] => CLIENT_LIST,dqwdqdxsadas,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 [2] => CLIENT_LIST,dwq1,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 ) [1] => Array ( [0] => Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 [1] => dqwdqdxsadas,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 [2] => dwq1,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240 ) )


نمی شه هیچ وقت آرایه 0 نباشه؟؟؟؟ فقط 1 رو بیاره. و به صورت زیر جواب باشه:


Array
(
[0] => Array
(
[0] => Ghae2semi
[1] => 33:30
[1] => 2
[1] => 2
[1] => 10272
[1] => Sun Jun 30 06:47:20 2013
[1] => 13729240
)

[1] => Array
(
[0] => dqwdqdxsadas
[1] => 33:30
[2] => 2
[3] => 2
[4] => 10272
[5] => Sun Jun 30 06:47:20 2013
[6] => 13729240
)

[2] => Array
(
[0] => dwq1
[1] => 33:30
[2] => 2
[3] => 2
[4] => 10272
[5] => Sun Jun 30 06:47:20 2013
[6] => 13729240
)
)

MMSHFE
دوشنبه 10 تیر 1392, 13:51 عصر
نه خونه صفر همیشه کل عبارت یافت شده با Pattern موردنظر شماست و خونه های بعدی، اونهایی هستن که با پرانتزهای شما همخوانی داشتن.

r0ot$harp
دوشنبه 10 تیر 1392, 14:05 عصر
تشکر دوست عزیز

یعنی این کد رو ساده تر نمی شه کرد؟؟؟ چون این کد هر 10 ثانیه یک بار باید 10000 خط رو Parse کنه:


$str = 'HEADER,CLIENT_LIST,Common Name,Real Address,Virtual Address,Bytes Received,Bytes Sent,Connected Since,Connected Since (time_t)
CLIENT_LIST,Ghae2semi,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
CLIENT_LIST,dqwdqdxsadas,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
CLIENT_LIST,dwq1,33:30,2,2,10272,Sun Jun 30 06:47:20 2013,13729240
END';
$pattern = '#^CLIENT_LIST,(.*)$#m';
if (preg_match_all($pattern, $str, $matches)) {
$pattern = '#([^,]+)#m';
$array = array();
foreach ($matches[1] as $match) {
if (preg_match_all($pattern, $match, $matches1)) {
array_push($array, $matches1[1]);
}
}
print_r($array);
}

می خوام که بهینه باشه.
باتشکر احسان

MMSHFE
دوشنبه 10 تیر 1392, 14:10 عصر
راستش فعلاً راهی به ذهنم نمیرسه ولی همین کد هم نباید مشکل خاصی توی این تعداد Request داشته باشه.