PDA

View Full Version : سوال: استفاده از عبارات با قاعده (حل شد)



Tarragon
سه شنبه 02 مهر 1392, 16:04 عصر
سلام
ببخشید من سورس یک سایت رو با curl دریافت می کنم مثلا سورسش هست :


$data = "*<input*name='input1'*value='example1'*>*<input*name='input2'*value='example2'*>*"

البته اینم بگم جای * هرچیزی ممکنه قرار بگیره
حالا من می خوام یک فانکشن بنویسم وقتی سورس و اسم تگ رو می نویسیم مقدار پیشفرضش رو برگردونه.
من یکم از عبارات با قاعده بلدم اما هرکاری کردم نتونستم اینو درست کنم ممنون می شم اگر کمکم کنید.
پیشاپیش از کمکتون ممنونم.:قلب:

qartalonline
سه شنبه 02 مهر 1392, 20:08 عصر
از کد زیر استفاده کنید:


<?php

$data = " <input id='df' name='input1' value='example1'> <div><input></div> <input name='input2' value='example2' > ";

$tag = 'input';
$name = 'input1';


preg_match_all('~<'.$tag.'[^>]*name=\''.$name.'\'[^>]*>~i', $data, $tags);
$string = implode($tags[0]);

preg_match_all('~value=\'[^>]*\'~i', $string, $val);
$value = implode($val[0]);

$value = preg_replace(array('/value/','/[\'\"\=]/') ,'' ,$value);

echo $value;

?>

MMSHFE
چهارشنبه 03 مهر 1392, 08:01 صبح
<?php
function GetDefaultValue($html, $tagName) {
$result = array();
if(preg_match('#.*?name=["|\']' . $tagName . '["|\'].*?value=["|\'](.*?)["|\']#im', $html, $result)) {
return $result[1];
}
return 'Not found';
}

$data = '<input id="df" name="input1" value="example1"/><input name="input2" value="example2"/>';
echo GetDefaultValue($data, 'input2'); // output : example2
?>

استفاده از RegEx اگه به درستی انجام بشه، هم استاندارده و هم خیلی بهتر از کلاسهایی مثل Simple HTML DOM یا حتی DOM Document خود PHP هست. برای مثال، میتونید خودتون مصرف حافظه و CPU کدی که گذاشتم رو با کدی که از DOM داره استفاده میکنه، مقایسه کنید. کلاسهای DOM در حالت بهینه، برای یک صفحه 40-30 کیلوبایتی، بیش از چند صد مگابایت فضای RAM اشغال میکنن (بدلیل امکان استفاده از متدهای مختلفی که تعریف کردن روی تمام اشیاء تولیدشده برای هرکدوم از عناصر صفحه). بنابراین، توصیه میکنم بجز درمواردی که هیچ راه چاره ای ندارین (تا بحال به چنین موردی بر نخوردم)، از DOM استفاده نکنید و همون RegEx رو مورد استفاده قرار بدین.

abolfazl-z
چهارشنبه 03 مهر 1392, 10:38 صبح
آقای شهرکی یک آموزش بزارید تا بقیه هم بهره ببرند!

Tarragon
چهارشنبه 03 مهر 1392, 14:27 عصر
با تشکر بسیار از اقای شهرکی عزیز
فقط یک مسئله :
اگر بخوام "a[target=frmleft]" ها رو هم پیدا کنم و اونی که توش نوشته EXAMPLE رو hrefش رو بگیرم چطوری باید بنویسم؟
خیلی ممنونم که اینقدر بفکر ما هستید.

MMSHFE
چهارشنبه 03 مهر 1392, 14:42 عصر
HTML نمونه رو بگذارین و بگین کدوم یکی رو میخواین تا RegEx مربوطه رو بگذارم ببینید چطور میشه.

Tarragon
چهارشنبه 03 مهر 1392, 15:02 عصر
با سلام

$data = "*<a*href='this'*target='frmleft'*>*ارسال مطلب جديد*</a>*<a*href='diiii'*target='frmleft'*>*دریافت مطالب جديد*</a>*";

یه همچین چیزی هست من می خوام this رو بهم برگردونه.

MMSHFE
چهارشنبه 03 مهر 1392, 16:10 عصر
function GetHrefValue($html, $target, $content) {
$result = array();
if(preg_match('#<a href=["|\']([^"\']*?)["|\'] target=["|\']' . $target . '["|\']>' . $content . '</a>#im', $html, $result)) {
return $result[1];
}
return 'Not found';
}

$data = '<a href="this" target="frmleft">ارسال مطلب جديد</a><a href="diiii" target="frmleft">دریافت مطالب جديد</a>';
echo GetHrefValue($data, 'frmleft', 'ارسال مطلب جديد') . '<br />'; // output : this
echo GetHrefValue($data, 'frmleft', 'دریافت مطالب جديد') . '<br />'; // output : diiii

Tarragon
چهارشنبه 03 مهر 1392, 17:13 عصر
با تشکر
حل شد.