PDA

View Full Version : مبتدی: استخراج عبارت از توی متن



#Elahe#
شنبه 07 تیر 1393, 23:39 عصر
سلام
من یه فایل xml دارم
چند هزار خط کد هستش
هر 10-20 خط یه سطری هست به این صورت

<Tag>phrase</Tag>
البته این phrase متغیر هست و این کد رو به عنوان مثال عرض کردم
من میخوام این phrase ها رو از این فایل استخراج کنم

البته اومدم از تو notepad ++ عبارت <Tag> رو سرچ کردم و همه این سطرها رو واسم آورد
اومدم تگها رو توسط همین notepad ++ حذف کنم دیدم شماره سطرها هم هستند و باید دونه دونه حذفشون کنم
مثل این :

Line 222: <Tag>phrase1</Tag>
Line 241: <Tag>phrase2</Tag>
Line 260: <Tag>phrase3</Tag>
Line 279: <Tag>phrase4</Tag>
Line 298: <Tag>phrase5</Tag>
Line 317: <Tag>phrase6</Tag>
اون شماره سطرها مزاحم کارم شدند

واسه همین دست به دامان کدنویسی شدم
یه کدی میخوام که عبارتهای داخل تگ Tag رو واسم استخراج کنه
مرسی

prans.info
یک شنبه 08 تیر 1393, 00:07 صبح
من از این استفاده می کنم :


function after($this, $inthat) {
if(!is_bool(strpos($inthat, $this))) {
return substr($inthat, strpos($inthat,$this)+strlen($this));
}else{
return false;
}
}
function before($this, $inthat) {
return substr($inthat, 0, strpos($inthat, $this));
}
function between($this, $that, $inthat) {
return before($that, after($this, $inthat));
}
function occurrencecount($this, $that, $inthat, $count) {

$newinthat = after("$that", after("$this", $inthat));
if($newinthat != false){
$count = $count + 1;
return occurrencecount($this, $that, $newinthat, $count);
}else{
return $count;
}
}
$xml = 'Line 222: <Tag>phrase1</Tag>Line 241: <Tag>phrase2</Tag>Line 260: <Tag>phrase3</Tag>Line 279: <Tag>phrase4</Tag>Line 298: <Tag>phrase5</Tag>Line 317: <Tag>phrase6</Tag>';

while (occurrencecount('<Tag>','</Tag>',$xml,'0')){
$ex = between ('<Tag>','</Tag>',$xml); $xml = str_replace ('<Tag>'.$ex.'</Tag>','',$xml); $ex .= '\n\r'.$ex; }
echo $ex;

pejman_view
یک شنبه 08 تیر 1393, 00:12 صبح
فایل های xml کار باهاشون راحت


$text = "
<tag>phrase1</tag>
<tag>phrase2</tag>
<tag>phrase3</tag>
<tag>phrase4</tag>
<tag>phrase5</tag>
";
//classe built-in domDocument ro fara mikhooni
$dom = new domDocument;
// matneto barash load mikoni
$dom->loadXML($text);
// migi kodoom tagro peyda kone
$content = $dom->getElementsByTagname('tag');

$tags = array();
foreach ($content as $item){
$tags[] = $item->nodeValue;
}

print_r($tags);


وسط متن همه توضیحات لازمه رو نوشتم

MMSHFE
یک شنبه 08 تیر 1393, 12:24 عصر
بابا چرا اینقدر کد رو پیچیده میکنید؟ الان شما میخواین هر خطی که توش <tag>...</tag> بود حذف بشه؟ اینو تست کنید:

$str = preg_replace('#^\s*<tag>.*?</tag>$#im', '', $str);

MMSHFE
یک شنبه 08 تیر 1393, 13:38 عصر
اگه میخواین استخراج بشه هم این کد رو استفاده کنید:

$matches = array();
if(preg_match_all('#^\s*(<tag>(.*?)</tag>)$#im', $str, $matches)) {
print_r($matches[1]); // entire tag element
print_r($matches[2]); // tag content only
}

pejman_view
یک شنبه 08 تیر 1393, 14:20 عصر
بابا چرا اینقدر کد رو پیچیده میکنید؟ الان شما میخواین هر خطی که توش <tag>...</tag> بود حذف بشه؟ اینو تست کنید:

$str = preg_replace('#^\s*<tag>.*?</tag>$#im', '', $str);

آقای شهرکی حالا دارن یاد می گیرن بهتر درست یاد بگیرن بدترین روش این که بخوان تو xml و html با regex کار کنند. یه قانون هست تو برنامه نویسی می گه تا زمانی که تابع ها و کلاس های آماده برای چیزی توسط زبان برنامه نویسی آماده شد هیچ وقت تلاش نکنیم از راه های خودمان پیش برویم.
و واقعاً کدی که نوشتم پیچیده نیست. 3 خط کلاً یکی لود کردن کلاس، بعدیش شناساندن متن و خط سوم هم پیدا کردن تگ و سپس یه حلقه که تگ ها را کامل استخراج کند اگر برای برنامه نویسی این کار ساده خیلی سخت باشد بایستی درباره خواندن دوباره کتاب های برنامه نویسی با PHP تجدید نظر کنند.

MMSHFE
یک شنبه 08 تیر 1393, 14:56 عصر
روی چه حسابی این حرف رو میزنید؟ مصرف حافظه XMLDom و SimpleHTMLDOM رو با RegExp یکی میکنید؟ بعلاوه مگه RegExp جزو امکانات آماده زبان PHP نیست؟ شما با ab مصرف حافظه و CPU و زمان پاسخ کد خودتون رو با کدی که من گذاشتم مقایسه کنید و بعد بگین بدترین روش استفاده از RegExp هست. بحث اصلاً سر سادگی و سختی کدنویسی نیست. سر لقمه دور سر چرخوندن و مصرف بیهوده منابع سروره. حتی ازنظر کوتاهی و سادگی کد هم فکر میکنم کدی که من گذاشتم خیلی ساده تر و قابل فهم تر از کدی باشه که شما گذاشتین (هرچند کد شما هم پیچیده نیست و فقط منظورم قیاس بین این دو کد بود)

pejman_view
یک شنبه 08 تیر 1393, 15:54 عصر
روی چه حسابی این حرف رو میزنید؟ مصرف حافظه XMLDom و SimpleHTMLDOM رو با RegExp یکی میکنید؟ بعلاوه مگه RegExp جزو امکانات آماده زبان PHP نیست؟ شما با ab مصرف حافظه و CPU و زمان پاسخ کد خودتون رو با کدی که من گذاشتم مقایسه کنید و بعد بگین بدترین روش استفاده از RegExp هست. بحث اصلاً سر سادگی و سختی کدنویسی نیست. سر لقمه دور سر چرخوندن و مصرف بیهوده منابع سروره. حتی ازنظر کوتاهی و سادگی کد هم فکر میکنم کدی که من گذاشتم خیلی ساده تر و قابل فهم تر از کدی باشه که شما گذاشتین (هرچند کد شما هم پیچیده نیست و فقط منظورم قیاس بین این دو کد بود)

کمی مثل اینکه لحن من بد بوده و باعث شد شما موضع بگیرید و کاملاً پوزش می طلبم. موضع گیری ها را بگذاریم کنار چون اینگونه بحث های علمی و تخصصی به میدان جنگ و دعوا و موضع گیری های بی جا تبدیل می شود. که ماشاء الله در این انجمن زیاد دیدم. بگذارید موضوع را از جنبه ی دیگر پاسخ دهیم.

مزایا و معایب Regex در مقابل تابع simpleDom

-آیا simpleDom در مقابل regular expression (Regex) منابع سخت افزاری بیشتری مصرف می کند؟
simpleDom و Regex هر دو در استفاده سخت افزار از منابع مختلفی استفاده می کنند و این بخاطر تکنیک های مختلف پردازشی است. Regular expression ها بخاطر استفاده از تکنیک text proccessing از CPU بیشتر و simpleDom بخاطر استفاده از تکنیک Parsing از رم بیشتری استفاده می کند.
*Regex مصرف سی پی یو بیشتر
*simpleDom مصرف رم بیشتر

- کار با regular expression ها آسانتر است یا simpleDom؟
نوشتن regex با توجه به اینکه کاری بس سخت و دشوار و نیاز به دقت بیشتری دارد بالتبع استفاده از simpleDom که به آسانی می توانید از کلاس آن استفاده و خروجی کنید.

- سرعت regular expression بیشتر است یا simpleDom؟
بالتبع سرعت regex با توجه به نوع پردازشش بالاتر است.

- دقت regular expression بیشتر است یا simpleDom؟
با توجه به اینکه نوشتن الگوهای regular expression بصورت پویا انجام پذیر نیست و برای هر مورد بایستی الگوی خاصی نوشتن شود و نوشتن این الگوها هم کاری کمی دشوار است و نیاز به دقت بالاتر دارد بنابراین simpleDom دقت بیشتری را در رسیدن به جواب دارد.

- حال با توجه به این موارد استفاده از کدام بهتر است؟
خوب بالتبع در هر مورد ما مزایا و معایبی گفتیم. شما با توجه به توانایی های خود و نوع کاری که دارید می توانید از هر دو آن ها استفاده نمایید.
اما بعنوان نویسنده این متن 1 سوال اساسی در ذهن شما بوجود می آورم. 1- آیا در کار خود دقت نیاز دارید یا سرعت؟ هر موقع به این جواب رسیدید می توانید روش مورد نظر خود را انتخاب نمایید.

MMSHFE
یک شنبه 08 تیر 1393, 16:04 عصر
یک مورد دیگه رو باید درنظر داشته باشیم و اون هم اینه که برای سرویس دهنده هاست ما مهمتره که مصرف پردازنده کمتر باشه یا مصرف حافظه و اگه از کدوم زیاد مصرف کنیم، اکانت ما Suspend میشه؟ بهرصورت همونطور که گفتین، مزایا و معایب هرکدوم مشخصه ولی اگه فرد توی RegExp به مهارت رسیده باشه (که ضرورت کار یک برنامه نویس خبره است)، شخصاً توصیه میکنم بجای کلاسهای کار با DOM از عبارات با قاعده استفاده بشه چون فرضاً Simple HTML DOM برای تفسیر یک صفحه 40 کیلوبایتی 1 مگابایت حافظه مصرف میکنه که اگه این سایت 1000 بازدیدکننده همزمان داشته باشه، به معنای اشغال 1 گیگابایت حافظه خواهد بود. بعلاوه با قدرت پردازنده های امروزی سرورها، پردازش RegExp اختلاف زیادی در بار پردازنده سرور ایجاد نمیکنه. درسته که RegExp مصرف CPU بیشتری داره ولی حقیقتاً این مصرف نسبت به مصرف پردازنده DOM (بخاطر تولید شئ برای هر Node و مقداردهیها و...) در خیلی از موارد کمتره (در عمل تست کردم که میگم).