برگزیده های پرشین تولز

تحلیل یک استرینگ !

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
یه رشته استرینگی داریم مثلا اینطوری:
text1;text2;text3;text4;text5
هرکدوم از اینها با ; جدا شدن. میخوام هر کدوم از این ها تو یه سطر از دیتابیس اینزرت بشه.
چطور باید اینهارو از هم جدا کنم و بتونم کاری کنم که یه حلقه تکرار درست بشه و دونه دونه اینها به ترتیب برن اینزرت بشن؟
 

متالیک

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
31 مارس 2007
نوشته‌ها
2,128
لایک‌ها
285
یه رشته استرینگی داریم مثلا اینطوری:
text1;text2;text3;text4;text5
هرکدوم از اینها با ; جدا شدن. میخوام هر کدوم از این ها تو یه سطر از دیتابیس اینزرت بشه.
چطور باید اینهارو از هم جدا کنم و بتونم کاری کنم که یه حلقه تکرار درست بشه و دونه دونه اینها به ترتیب برن اینزرت بشن؟

سلام علیکم

بهترین روش استفاده از تابع explode است. این تابع یک رشته را قطعه قطعه کرده و یک آرایه را برمی گرداند.
من جدا کردنش رو خدمت شما عرض می کنم فکر می کنم که بقیش رو خودتون بتونید انجام بدهید:

PHP:
<?php

$str = "text1;text2;text3;text4;text5";

$pieces = explode(";", $str);

?>

در بالا str شما توسط explode جاهایی که بین ایشان ; دارند جدا شده و در آرایه ی pieces ذخیره می گردند.
اگر جداکننده ی شما فرق کرد مثلا ; نبود باید در آرگومان اول تابع مشخص کنید.
برای دستیابی به هر یک از قطعات فوق شماره ی اندیس آرایه را بدهید،توجه کنید اندیس از صفر شروع می شود

مثال:

PHP:
echo $pieces[0]; // text1
echo $pieces[1]; // text2

حالا که قطعات را در اختیار دارید به راحتی می توانید درون جدول قرار دهید که خود بر کم و کیف آن واقف هستید.

موفق باشید
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
سلام علیکم

بهترین روش استفاده از تابع explode است. این تابع یک رشته را قطعه قطعه کرده و یک آرایه را برمی گرداند.
من جدا کردنش رو خدمت شما عرض می کنم فکر می کنم که بقیش رو خودتون بتونید انجام بدهید:

PHP:
<?php

$str = "text1;text2;text3;text4;text5";

$pieces = explode(";", $str);

?>

در بالا str شما توسط explode جاهایی که بین ایشان ; دارند جدا شده و در آرایه ی pieces ذخیره می گردند.
اگر جداکننده ی شما فرق کرد مثلا ; نبود باید در آرگومان اول تابع مشخص کنید.
برای دستیابی به هر یک از قطعات فوق شماره ی اندیس آرایه را بدهید،توجه کنید اندیس از صفر شروع می شود

مثال:

PHP:
echo $pieces[0]; // text1
echo $pieces[1]; // text2

حالا که قطعات را در اختیار دارید به راحتی می توانید درون جدول قرار دهید که خود بر کم و کیف آن واقف هستید.

موفق باشید
مرسی استاد متالیک !
اما راه دیگه ای بجز تابع explode نیست؟؟

یه راه بی دردسر برای خوندن اون آرایه هم میتونی بدی؟ تابع list واینا؟
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
مرسی استاد متالیک !
اما راه دیگه ای بجز تابع explode نیست؟؟


یه راه بی دردسر برای خوندن اون آرایه هم میتونی بدی؟ تابع list واینا؟

بدون explode با دردسر بیشتر میخوای دارم :D


PHP:
<?php 
$info=array();
$info[]=0;
$info[]=2;
function arr_print(&$data)
{
 foreach ( $data as $item )
  print "$item<br>";  
}

arr_print($info);
?>
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
مرسی :D
همون یه راه درست درمون برای خوندن آرایه یکی بگه مرسی میشم :دی
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
مرسی :D
همون یه راه درست درمون برای خوندن آرایه یکی بگه مرسی میشم :دی

پس این تابع چیه :D

PHP:
<?php  
$info=array(); 
$info[]=0; 
$info[]=2; 
function arr_print(&$data) 
{ 
 foreach ( $data as $item ) 
  print "$item<br>";   
} 

arr_print($info); 
?>
 

firebird

Registered User
تاریخ عضویت
2 جولای 2005
نوشته‌ها
1,424
لایک‌ها
10
سن
46
یه رشته استرینگی داریم مثلا اینطوری:
text1;text2;text3;text4;text5
هرکدوم از اینها با ; جدا شدن. میخوام هر کدوم از این ها تو یه سطر از دیتابیس اینزرت بشه.
چطور باید اینهارو از هم جدا کنم و بتونم کاری کنم که یه حلقه تکرار درست بشه و دونه دونه اینها به ترتیب برن اینزرت بشن؟
حلقه میخوای چی کار همه رو با هم یه جا insert کن:
PHP:
$query = preg_replace('/(.*?)(;|$)/', "INSERT INTO `table` (`field`) VALUES ('$1');\\n", $string);
 

hmsn

کاربر تازه وارد
تاریخ عضویت
17 آگوست 2006
نوشته‌ها
196
لایک‌ها
0
سن
36
محل سکونت
تو يه خونمون
firebird عالي بود
دس خوش ، هوشت رو به رخ كشيدي
آفرين
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
حلقه میخوای چی کار همه رو با هم یه جا insert کن:
PHP:
$query = preg_replace('/(.*?)(;|$)/', "INSERT INTO `table` (`field`) VALUES ('$1');\\n", $string);


تست نکردم کار میکنه یا نه اما preg_replace نسبت به explode به دلیل پیچیدگی کد منابع بیشتری رو مصرف میکنه.
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
حلقه میخوای چی کار همه رو با هم یه جا insert کن:
PHP:
$query = preg_replace('/(.*?)(;|$)/', "INSERT INTO `table` (`field`) VALUES ('$1');\\n", $string);
مرسی استاد بزرگ !!

/

حسین ! اون asp آخر یوزرنیمت عصمت دانش php ت رو برده زیر سوال ها :D
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
مرسی استاد بزرگ !!

/

حسین ! اون asp آخر یوزرنیمت عصمت دانش php ت رو برده زیر سوال ها :D
اساتید !!
یه سوال دیگه ! اون استرینگی که داشتم این بود دیگه
کد:
text1;text2;text3;text4;text5
که با همون اکسپلوید راحت جدا میشه و اینا. و هر عبارت خیلی راحت ریخته میشه تو دیتابیس.
حالا یه سوال دیگه ! اگه استرینگمون اینطوری باشه:
کد:
text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>
اون چیزایی که داخل <> هستن باید تو یه فیلد دیگه اینزرت بشن. یعنی تیبل دوتا فیلد داره !

چجوری میشه این؟
 

متالیک

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
31 مارس 2007
نوشته‌ها
2,128
لایک‌ها
285
اساتید !!
یه سوال دیگه ! اون استرینگی که داشتم این بود دیگه
کد:
text1;text2;text3;text4;text5
که با همون اکسپلوید راحت جدا میشه و اینا. و هر عبارت خیلی راحت ریخته میشه تو دیتابیس.
حالا یه سوال دیگه ! اگه استرینگمون اینطوری باشه:
کد:
text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>
اون چیزایی که داخل <> هستن باید تو یه فیلد دیگه اینزرت بشن. یعنی تیبل دوتا فیلد داره !

چجوری میشه این؟

یک کمی پیچیدگی های خاص خودش رو داره:

PHP:
<?php

$str ="text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>";
$str = htmlspecialchars($str.";", ENT_QUOTES); 

$pieces = explode("&gt;;", $str);

foreach ($pieces as $value) {
    $newpieces = explode("&lt;", $value);
    foreach ($newpieces as $newvalue) {	
      echo "$newvalue<br>\n";
    }
}

?>
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
یک کمی پیچیدگی های خاص خودش رو داره:

PHP:
<?php

$str ="text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>";
$str = htmlspecialchars($str.";", ENT_QUOTES); 

$pieces = explode("&gt;;", $str);

foreach ($pieces as $value) {
    $newpieces = explode("&lt;", $value);
    foreach ($newpieces as $newvalue) {	
      echo "$newvalue<br>\n";
    }
}

?>
نگرفتم استاد !
ببین این گویا خروجی رو همونطوری توی حلقه تکرار میریزه تو $newvalue !! اما چیزی که من میخوام اینه که عبارت داخل <> رو بریزه تو یه متغیر دیگه ! گرفتی؟ :دی
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
راستی ! یه سریها این وسط هستن <> ندارن اصلا !! باید متغیر دومی null برگرده. عجب داستانی شدها !!
 

متالیک

کاربر قدیمی پرشین تولز
کاربر قدیمی پرشین تولز
تاریخ عضویت
31 مارس 2007
نوشته‌ها
2,128
لایک‌ها
285
توی سورسی که نوشتم فقط یک مشکلی هست که باید برطرف کنم.
 

hossein_asp

کاربر تازه وارد
تاریخ عضویت
31 مارس 2005
نوشته‌ها
639
لایک‌ها
0
سن
39
محل سکونت
جایی که خدا نباشد
حسین ! اون asp آخر یوزرنیمت عصمت دانش php ت رو برده زیر سوال ها :D

پیش شما دوستان که ما هنوز اول راهیم :blush: قضييه يکم بدتر از اين حرفاست :D من اول دلفي رو خیلی زیاد کار کردم بعد ازش خسته شدم رفتم asp کار کردم اونم زياد به دلم ننشت رفتم سراغ php که خدايش خيلي توپه.این asp اش برا اون موقع است که Asp کار میکردم :happy:

این کارتو کلا راه میندازه فقط به جای پرینت تو صفحه insert کن تو db

PHP:
<?php

function arr_print(&$data)  
{  
 foreach ( $data as $item ) 
 { 
  $len=strlen($item)-1;
  if(strpos($item,">")===$len)
  {
   $item= substr($item,0,$len);
  }
  print "$item<br>"; //insert 2 db
 }   
}   
$test="text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>";
 $delims = ";<";
 $txt=array();
 $word = strtok($test , $delims);
 while (is_string($word))
 {
  if ($word)
  $txt [] =trim($word); 
  $word=strtok($delims);
  
 }

arr_print($txt);  

 ?>
 

firebird

Registered User
تاریخ عضویت
2 جولای 2005
نوشته‌ها
1,424
لایک‌ها
10
سن
46
firebird عالي بود
دس خوش ، هوشت رو به رخ كشيدي
آفرين

شما همیشه باید وقتی بحث پردازش متن میشه اول بری سراغ regex ها بعد اگه امکانش نبود، بشینی خودت کد بنویسی.

تست نکردم کار میکنه یا نه اما preg_replace نسبت به explode به دلیل پیچیدگی کد منابع بیشتری رو مصرف میکنه.

اگر regex خوب و بهینه نوشته بشه. یک خط کد که موتور داخلی PCRE اجرا میکنه و برنامه نویسهای حرفه ای اون رو ساختند به مراتب بیشتر از ده خط کد نوشته شده توسط explode و حلقه و ... زمان میبره. اگر میخوایم بحث رو ببریم اون سمت میشه profile کرد و کدها رو با هم مقایسه کرد.

اساتید !!
یه سوال دیگه ! اون استرینگی که داشتم این بود دیگه
کد:
text1;text2;text3;text4;text5
که با همون اکسپلوید راحت جدا میشه و اینا. و هر عبارت خیلی راحت ریخته میشه تو دیتابیس.
حالا یه سوال دیگه ! اگه استرینگمون اینطوری باشه:
کد:
text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>
اون چیزایی که داخل <> هستن باید تو یه فیلد دیگه اینزرت بشن. یعنی تیبل دوتا فیلد داره !

چجوری میشه این؟

این هم این شکلی میشه انجام داد:
PHP:
$query = preg_replace('/([^<]*)<([^>]*)>(;|$)/', "INSERT INTO `table` (`field1`, `field2`) VALUES ('$1', '$2');\\n", $string);
 

Shahed

کاربر قدیمی پرشین تولز
تاریخ عضویت
30 ژوئن 2003
نوشته‌ها
7,270
لایک‌ها
34
محل سکونت
mt.cgi
شما همیشه باید وقتی بحث پردازش متن میشه اول بری سراغ regex ها بعد اگه امکانش نبود، بشینی خودت کد بنویسی.



اگر regex خوب و بهینه نوشته بشه. یک خط کد که موتور داخلی PCRE اجرا میکنه و برنامه نویسهای حرفه ای اون رو ساختند به مراتب بیشتر از ده خط کد نوشته شده توسط explode و حلقه و ... زمان میبره. اگر میخوایم بحث رو ببریم اون سمت میشه profile کرد و کدها رو با هم مقایسه کرد.



این هم این شکلی میشه انجام داد:
PHP:
$query = preg_replace('/([^<]*)<([^>]*)>(;|$)/', "INSERT INTO `table` (`field1`, `field2`) VALUES ('$1', '$2');\\n", $string);
یا امام مجید !!
shock.gif
shock.gif

firebierd جان دمت گرم !
wha[1].gif
 
بالا