PDA

View Full Version : عبارت با قاعده



H:Shojaei
یک شنبه 23 فروردین 1394, 23:18 عصر
سلام...
یه سوال دارم یه صفحه رو گرفتم محتواشو حالا میخوام بخشیش رو بردارم و باز داخل تک تک تگهای قسمتی که برداشتم رو بکشم بیرون.
حالا چند تا سوال دارم:
1 این که چطور بگیم مثلا از جایی که با <tag class="abcd" شروع شده باشه تا جایی که با </tag تموم شده این بخش رو بکشیم بیرون؟
2 این که چطور بین دوتا تگ رو برداریم <tag>countent</tag> مثلا میخوام countent رو از این تگ بردارم چکار کنم؟

3 و این که من هر کاری میکنم همین عبارات با قاعده تو سرم نمیره که نمیره دوستان چطور یاد بگیرمش؟

MohammadReza1994
یک شنبه 23 فروردین 1394, 23:29 عصر
درس نظریه زبان و اوتوماتا پاس کردی؟

n0o0b_sina
دوشنبه 24 فروردین 1394, 00:07 صبح
سلام
1 رو متوجه نشدم
برای 2: <tag>([\s\S]*?)<\/tag>
از سایتایی مثله سایته زیر استفاده کنید، یکم باید همت داشته باشید و هی کد بزنید.
http://www.regexr.com/

MMSHFE
دوشنبه 24 فروردین 1394, 02:25 صبح
1 :

if(preg_match_all('#<tag class="abcd".*?>(.*?)</tag>#i', $string, $matches)) {
print_r($matches[1]);
}

2 :

if(preg_match_all('#<tag>(.*?)</tag>#i', $string, $matches)) {
print_r($matches[1]);
}

j_naroogha@yahoo.com
دوشنبه 24 فروردین 1394, 08:04 صبح
simplehtmldom یه کتابخونه اس که میتونه این کار رو براتون انجام بده...

MMSHFE
دوشنبه 24 فروردین 1394, 09:04 صبح
بهتره با این کلاس تا جایی که میشه کار نکنید چون برای Parse کردن یک صفحه فرضاً 40 کیلوبایتی، 1 مگابایت رم مصرف میکنه. علتش هم ایجاد شئ برای تک تک نودها (تگها) هست.

j_naroogha@yahoo.com
دوشنبه 24 فروردین 1394, 09:28 صبح
بهتره با این کلاس تا جایی که میشه کار نکنید چون برای Parse کردن یک صفحه فرضاً 40 کیلوبایتی، 1 مگابایت رم مصرف میکنه. علتش هم ایجاد شئ برای تک تک نودها (تگها) هست.

ممنون. کتابخونه سبکتر شببیه به همین سراغ ندارین؟

MMSHFE
دوشنبه 24 فروردین 1394, 09:33 صبح
کلاً DOM Parserها سنگین هستن. تا جایی که میشه و میتونید، سعی کنید با کمک عبارات با قاعده بخشهای دلخواهتون رو از متن استخراج کنید و فقط جاهایی که واقعاً نمیشه یا بهینه نیست، از DOM Parser استفاده کنید. همین Simple HTML DOM کلاس خوبیه.

n0o0b_sina
دوشنبه 24 فروردین 1394, 12:32 عصر
1 :

if(preg_match_all('#<tag class="abcd".*?>(.*?)</tag>#i', $string, $matches)) {
print_r($matches[1]);
}

2 :

if(preg_match_all('#<tag>(.*?)</tag>#i', $string, $matches)) {
print_r($matches[1]);
}
جناب شهرکی به نظرم بهتره به جای (.*?) از ([\s\S]*?) استفاده کنیم چون ممکنه اون وسط یه line break بیاد و کار رو خراب کنه.
تاپیک مارم که قفل کردید، ولی بابت همه ی راهنماییهاتون تشکر میکنم ازتون و واقعا باهاتون موافقم، اول رفاه و کار و درآمد، بعد زبان جدید :دی

MMSHFE
دوشنبه 24 فروردین 1394, 12:35 عصر
برای چند سطری ها نیاز نیست اینقدر کار رو پیچیده کنید. کافیه بعد از i توی پترن، یک s هم اضافه کنید تا . شامل Whitspace هم بشه.

H:Shojaei
دوشنبه 24 فروردین 1394, 17:16 عصر
ممنون دوستان مخصوصا از جناب شهرکی...
ولی اینا کار نکردن :|
الان من میخوام بین این تگ که یک تگ تیبل هست رو بردارم یعنی تمام بدنه تیبل رو:
<table class="MsoNormalTable" ... >
...
...
</table>
بعد باز داخل این تیبل تگهایی هست که یه مقادیری تو این تگها هست این هارو هم میخوام بکشم بیرون ولی این کدهایی که دادین جواب نمیده کلا خالی برمیگردونه...
این هم مثلا یک سطر که میخوام بکشمش بیرون:
مثلا اون الماس و 44444444 رو میخوام فقط بردارم...

</tr><tr style="mso-yfti-irow: 1;">
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL">
<span style="font-size: 12.0pt; font-family: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman';" lang="AR-SA">الماس</span>
</p>
</td>
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 12.0pt; font-family: 'Times New Roman','serif'; mso-fareast-font-family: 'Times New Roman';" dir="LTR">44444444</span>
</p>
</td>

bagherok
دوشنبه 24 فروردین 1394, 19:40 عصر
الان من میخوام بین این تگ که یک تگ تیبل هست رو بردارم یعنی تمام بدنه تیبل رو:
<table class="MsoNormalTable" ... >
...
...
</table>
بعد باز داخل این تیبل تگهایی هست که یه مقادیری تو این تگها هست این هارو هم میخوام بکشم بیرون ولی این کدهایی که دادین جواب نمیده کلا خالی برمیگردونه...
این هم مثلا یک سطر که میخوام بکشمش بیرون:
مثلا اون الماس و 44444444 رو میخوام فقط بردارم...




$string='
<!DOCTYPE html>
<html>
<head>
<title>Page Title</title>
</head>
<body>
.
.
.
.

<table class="Table" >
<tr style="mso-yfti-irow: 1;">
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL">
<span style="font-size: 12.0pt;" lang="AR-SA">ممنون دوستان مخصوصا از جناب شهرکی...
ولی اینا کار نکردن :|
الان من میخوام بین این تگ که یک تگ تیبل هست رو بردارم یعنی تمام بدنه تیبل رو:
</span>
</p>
</td>
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 12.0pt;" dir="LTR">بعد باز داخل این تیبل تگهایی هست که یه مقادیری تو این تگها هست این هارو هم میخوام بکشم بیرون ولی این کدهایی که دادین جواب نمیده کلا خالی برمیگردونه...
این هم مثلا یک سطر که میخوام بکشمش بیرون:
مثلا اون الماس و 44444444 رو میخوام فقط بردارم...</span>
</p>
</td>
</tr>
</table>
.
.
.
.
<table class="MsoNormalTable" >
<tr style="mso-yfti-irow: 1;">
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL">
<span style="font-size: 12.0pt;" lang="AR-SA">الماس</span>
</p>
</td>
<td style="padding: .75pt .75pt .75pt .75pt;">
<p class="MsoNormal" style="margin-bottom: .0001pt; text-align: right; line-height: normal; direction: rtl; unicode-bidi: embed;" dir="RTL"><span style="font-size: 12.0pt;" dir="LTR">44444444</span>
</p>
</td>
</tr>
</table>
.
.
.
</body>
</html>
';






if(preg_match('#<table.*?class="MsoNormalTable".*?>(.*?)</table>#is', $string, $table)) {
if(preg_match_all('#<span .*?>(.*?)</span>#is', $table[1], $matches)) {
print_r($matches[1]);
}
}

a_arya
دوشنبه 24 فروردین 1394, 19:40 عصر
if(preg_match_all('/<tr style="mso-yfti-irow: 1;">.*<td.*class="MsoNormal".*lang="AR-SA">(.*)<\/span>.*<\/td>.*<td.*class="MsoNormal".*dir="LTR">(.*)<\/span>.*<\/td>.*<\/tr>/isU', $str, $matches)) {
foreach($matches[1] as $i => $v) {
echo $matches[1][$i] . '=>' . $matches[2][$i] . '<br>';
}
var_dump($matches);
}