آژانس هواپیمایی
pop up

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

شروع موضوع توسط Shahed ‏11 دسامبر 2007 در انجمن PHP

  1. Shahed

    Shahed Registered User

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

    متالیک Registered User

    تاریخ عضویت:
    ‏31 مارس 2007
    نوشته ها:
    1,938
    تشکر شده:
    59
    سلام علیکم

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

    PHP:
    <?php

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

    $pieces explode(";"$str);

    ?>

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

    مثال:

    PHP:
    echo $pieces[0]; // text1
    echo $pieces[1]; // text2
    حالا که قطعات را در اختیار دارید به راحتی می توانید درون جدول قرار دهید که خود بر کم و کیف آن واقف هستید.

    موفق باشید
     
  3. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    مرسی استاد متالیک !
    اما راه دیگه ای بجز تابع explode نیست؟؟

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

    hossein_asp کاربر تازه وارد

    تاریخ عضویت:
    ‏31 مارس 2005
    نوشته ها:
    637
    تشکر شده:
    0
    محل سکونت:
    جایی که خدا نباشد
    بدون explode با دردسر بیشتر میخوای دارم :D


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

    arr_print($info);
    ?>
     
  5. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    مرسی :D
    همون یه راه درست درمون برای خوندن آرایه یکی بگه مرسی میشم :دی
     
  6. hossein_asp

    hossein_asp کاربر تازه وارد

    تاریخ عضویت:
    ‏31 مارس 2005
    نوشته ها:
    637
    تشکر شده:
    0
    محل سکونت:
    جایی که خدا نباشد
    پس این تابع چیه :D

    PHP:
    <?php  
    $info
    =array(); 
    $info[]=0
    $info[]=2
    function 
    arr_print(&$data

     foreach ( 
    $data as $item 
      print 
    "$item<br>";   


    arr_print($info); 
    ?> 
     
  7. boxilink
  8. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    ئه؟ :D این بود؟ :D
    مرسی :D
     
  9. hossein_asp

    hossein_asp کاربر تازه وارد

    تاریخ عضویت:
    ‏31 مارس 2005
    نوشته ها:
    637
    تشکر شده:
    0
    محل سکونت:
    جایی که خدا نباشد
    خواهش میکنم ;)
     
  10. firebird

    firebird Registered User

    تاریخ عضویت:
    ‏2 جولای 2005
    نوشته ها:
    1,424
    تشکر شده:
    9
    حلقه میخوای چی کار همه رو با هم یه جا insert کن:
    PHP:
    $query preg_replace('/(.*?)(;|$)/'"INSERT INTO `table` (`field`) VALUES ('$1');\\n"$string);
     
  11. hmsn

    hmsn کاربر تازه وارد

    تاریخ عضویت:
    ‏17 آگوست 2006
    نوشته ها:
    196
    تشکر شده:
    0
    محل سکونت:
    تو يه خونمون
    firebird عالي بود
    دس خوش ، هوشت رو به رخ كشيدي
    آفرين
     
  12. hossein_asp

    hossein_asp کاربر تازه وارد

    تاریخ عضویت:
    ‏31 مارس 2005
    نوشته ها:
    637
    تشکر شده:
    0
    محل سکونت:
    جایی که خدا نباشد

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

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    مرسی استاد بزرگ !!

    /

    حسین ! اون asp آخر یوزرنیمت عصمت دانش php ت رو برده زیر سوال ها :D
     
  14. avajang.com .leftavajang.com.right
  15. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    اساتید !!
    یه سوال دیگه ! اون استرینگی که داشتم این بود دیگه
    کد:
    text1;text2;text3;text4;text5
    که با همون اکسپلوید راحت جدا میشه و اینا. و هر عبارت خیلی راحت ریخته میشه تو دیتابیس.
    حالا یه سوال دیگه ! اگه استرینگمون اینطوری باشه:
    کد:
    text1<yek>;text2<do>;text3<se>;text4<chahar>;text5<panj>
    اون چیزایی که داخل <> هستن باید تو یه فیلد دیگه اینزرت بشن. یعنی تیبل دوتا فیلد داره !

    چجوری میشه این؟
     
  16. متالیک

    متالیک Registered User

    تاریخ عضویت:
    ‏31 مارس 2007
    نوشته ها:
    1,938
    تشکر شده:
    59
    یک کمی پیچیدگی های خاص خودش رو داره:

    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";
        }
    }

    ?>

     
  17. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    نگرفتم استاد !
    ببین این گویا خروجی رو همونطوری توی حلقه تکرار میریزه تو $newvalue !! اما چیزی که من میخوام اینه که عبارت داخل <> رو بریزه تو یه متغیر دیگه ! گرفتی؟ :دی
     
  18. Shahed

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    راستی ! یه سریها این وسط هستن <> ندارن اصلا !! باید متغیر دومی null برگرده. عجب داستانی شدها !!
     
  19. متالیک

    متالیک Registered User

    تاریخ عضویت:
    ‏31 مارس 2007
    نوشته ها:
    1,938
    تشکر شده:
    59
    توی سورسی که نوشتم فقط یک مشکلی هست که باید برطرف کنم.
     
  20. hossein_asp

    hossein_asp کاربر تازه وارد

    تاریخ عضویت:
    ‏31 مارس 2005
    نوشته ها:
    637
    تشکر شده:
    0
    محل سکونت:
    جایی که خدا نباشد
    پیش شما دوستان که ما هنوز اول راهیم :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)
      {
       
    $itemsubstr($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);  

     
    ?>
     
  21. firebird

    firebird Registered User

    تاریخ عضویت:
    ‏2 جولای 2005
    نوشته ها:
    1,424
    تشکر شده:
    9
    شما همیشه باید وقتی بحث پردازش متن میشه اول بری سراغ regex ها بعد اگه امکانش نبود، بشینی خودت کد بنویسی.

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

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

    Shahed Registered User

    تاریخ عضویت:
    ‏30 ژوئن 2003
    نوشته ها:
    7,175
    تشکر شده:
    21
    محل سکونت:
    mt.cgi
    یا امام مجید !! [​IMG] [​IMG]
    firebierd جان دمت گرم ! [​IMG]