رفتن به مطلب

کمک در خصوص یافتن لینک عکس در یک سند با استفاده از عبارات با قاعده (Regular expressions)


پست های پیشنهاد شده

سلام خدمت دوستان و اساتید عزیز

یه مشکلی برام پیش اومده،ممنون میشم اگر بنده رو راهنمایی بفرمایید

میخوام لینک عکس هایی که درون تگ img و داخل سند html هست (بعنوان مثال یک پیج سورس ) رو با استفاده از دستور العمل های منطقی regex تشخیص بدم و لینکش رو استخراج کنم...فرض کنید که کدهای داخل یک پیج سورس به این صورت هست:


<div class="nwstxtmainpane">
<div class="nwstxtlinkicons">
<span id="ctl00_bodyHolder_newstextDetail_newstxtActLink "><a class="lnk" href="printable.php?nn=13940109000599" target="_blank"><img border=0 src="shares/img/print.gif" width="25" alt="نسخه چاپي" /></a><a class="lnk" href="mail.php?nn=13940109000599" target="_blank"><img border=0 src="shares/img/email.gif" width="25" alt="ارسال به دوستان" /></a></span>
</div>
<div class="nwstxttoppane">
<div class="nwstxtnewsinfo">
<span id="ctl00_bodyHolder_newstextDetail_nwstxtInfoPane "><div class="nwstxtrotitr">هادی محمدی فر</div><div class="nwstxtinfotitle">حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو</div><p class="nwstxtlead" style="line-height: 160%;">با توجه به نقش تعیین کننده جنگ زمینی، ماهیت رهبری انصارالله، و نقش تخریبی القاعده در یمن می توان گفت با وحدت جریان های سیاسی یمن و همدلی علمای یمن با کمیته های مردمی تمامی سناریوهای عربستان و رژیم صهیونیستی به حداقل خواهد رسید.</P></span>
</div>
<div class="nwstxtpic">
<span id="ctl00_bodyHolder_newstextDetail_nwstxtPicPane" ><img alt="حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو" title="حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو" src='http://up.mlmarketing.ir/news/wpid-1956227265.jpg' /></span>
</div>
</div>
<div style="float: left; clear: both;">
<ul class="sociallnk">
<!--- TWITTER -->
<li>
<a href="https://twitter.com/share" class="twitter-share-button">Tweet</a>
</li>
<!--- GOOGLE PLUS -->
<li>
<div class="g-plusone" data-size="medium"></div>
</li>
<!--- FACEBOOK -->
<div style="clear: both;"></div>
</ul>
</div>

خوب همونطوری که میبینید یک تگ عکس درون این کد وجود داره، همچنین چندتا دستور src دیگه هم هست داخل کد، حالا خواسته ی من این هست که اولا تگ عکس رو شناسایی کنم، و درون یک متغیر بریزم، بعد از داخل این تگ بیام دستور src رو پیدا کنم و لینک عکس داخل کوتیشن ها رو استخراج کنم و بریزم داخل یک متغیر دیگه...

خودم تا یکجایی رفتم جلو ولی نمیدونم چرا کار نمیکنه:


preg_match_all("/<img alt([^`]*?)>/", $matches[1][0], $matchesb);

preg_match_all("/src=\"([^`]*?)\"/", $matchesb[1][0], $matchesc);[/left]



[left]

توسط دستور preg_match اومدم کل تگ img رو ریختم داخل متغیر Matchesb و بعد دوباره با همین دستور ، دستور src رو شناسایی کردم و ریختم توی متغیر matchesc طوری که داخل متغیر matchesc فقط لینک عکس ها موجود باشه. متغیر matches هم داخلش همین پیج سورسی که بالا قید کردم هست... ولی همونطوری که گفتم دوستان موقعی که میخوام از متغیر آخر که لینکها توشه استفاده کنم چیزی نیست و عمل نمیکنه

تو اینترنت گشتم این کد رو پیدا کردم:


\bhttps?:[^)''"]+\.(?:jpg|jpeg|gif|png)(?![a-z/])

فقط نمیدونم چطور باید تو دستور preg_match_all استفاده کنم؟

این دو تا حالت رو امتحان کردم ارور داد :


preg_match_all("\bhttps?:[^)''"]+\.(?:jpg|jpeg|gif|png)(?![a-z/])", $matches[1][0], $matchesb);
preg_match_all(\bhttps?:[^)''"]+\.(?:jpg|jpeg|gif|png)(?![a-z/]), $matches[1][0], $matchesb;

به این حالت هم استفاده کردم :


preg_match_all('\bhttps?:[^)''"]+\.(?:jpg|jpeg|gif|png)(?![a-z/])', $matches[1][0], $matchesb);

این ارور رو داد:

Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING in

از اساتید سپاسگذارم میشم اگه لطف بفرمایند بنده رو راهنمایی کنند

مرسی

یاعلی

ویرایش شده توسط sajjad_fx
لینک به ارسال

مثال ساده :


$words="<div class=\"nwstxtmainpane\">
<div class=\"nwstxtlinkicons\">
<span id=\"ctl00_bodyHolder_newstextDetail_newstxtActLink \"><a class=\"lnk\" href=\"printable.php?nn=13940109000599\" target=\"_blank\"><img border=0 src=\"shares/img/print.gif\" width=\"25\" alt=\"نسخه چاپي\" /></a><a class=\"lnk\" href=\"mail.php?nn=13940109000599\" target=\"_blank\"><img border=0 src=\"shares/img/email.gif\" width=\"25\" alt=\"ارسال به دوستان\" /></a></span>
</div>
<div class=\"nwstxttoppane\">
<div class=\"nwstxtnewsinfo\">
<span id=\"ctl00_bodyHolder_newstextDetail_nwstxtInfoPane \"><div class=\"nwstxtrotitr\">هادی محمدی فر</div><div class=\"nwstxtinfotitle\">حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو</div><p class=\"nwstxtlead\" style=\"line-height: 160%;\">با توجه به نقش تعیین کننده جنگ زمینی، ماهیت رهبری انصارالله، و نقش تخریبی القاعده در یمن می توان گفت با وحدت جریان های سیاسی یمن و همدلی علمای یمن با کمیته های مردمی تمامی سناریوهای عربستان و رژیم صهیونیستی به حداقل خواهد رسید.</P></span>
</div>
<div class=\"nwstxtpic\">
<span id=\"ctl00_bodyHolder_newstextDetail_nwstxtPicPane\" ><img alt=\"حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو\" title=\"حمله عربستان به یمن؛ چرایی، پیامدها و چالش های پیش رو\" src='http://up.mlmarketing.ir/news/wpid-1956227265.jpg' /></span>
</div>
</div>
<div style=\"float: left; clear: both;\">
<ul class=\"sociallnk\">
<!--- TWITTER -->
<li>
<a href=\"https://twitter.com/share\" class=\"twitter-share-button\">Tweet</a>
</li>
<!--- GOOGLE PLUS -->
<li>
<div class=\"g-plusone\" data-size=\"medium\"></div>
</li>
<!--- FACEBOOK -->
<div style=\"clear: both;\"></div>
</ul>
</div>";

preg_match_all("<img.+?src=[\"|'](.*?)[\"|'].+?>", $words, $matches);
print_r($matches[1]);

سلام

بسیار ممنونم از راهنماییتون دوست عزیز

بررسی کردم کد رو عمل میکنه فقط یه نکته، الان خروجی متغییر matches به این صورت هست:

Array ( [0] => shares/img/print.gif [1] => shares/img/email.gif [2] =>

http://up.mlmarketing.ir/news/wpid-1956227265.jpg )

چطوری میتونم بخش اول رو حذف کنم؟ به عبارتی فقط تگ های عکسی که لینک کامل به صورت http://... هست رو پیدا کنم و تو متغیر بزارم؟

باز هم تشکر میکنم

لینک به ارسال

سلام.


<?php
foreach( $matches as $key ){
if( strpos( $key, 'http://' ) !== false ){
$editedarray[] = $key
}
}
?>

لینک به ارسال

سلام.

<?php

foreach( $matches as $key ){

if( strpos( $key, 'http://' ) !== false ){

$editedarray[] = $key

}

}

?>

سلام

دوست عزیز مرسی بابت پاسخت

میشه یکم بیشتر توضیح بفرمایید که چه طوری باید از این کد استفاده کنم؟ فقط تا اینقدر فهمیدم که این کد میاد چک میکنه که داخل متغیر key عبارت http داره یا نه، و اگر برابر با false نباشه مقدار true رو میده، باقشو متوجه نشدم حقیقت مخصوصا خط قرمز رو، بعد اینکه آیا نمیشه همین کار رو با regex انجام داد که فقط لینک های کامل و دارای http رو شناسایی کنه؟

مرسی از توجه شما

ویرایش شده توسط sajjad_fx
لینک به ارسال

ببینید رجکس خیلی کند تر از strpos هست اما با regex هم میشه انجام داد. اون editedarray هم من فرض کرده که قبل از ورود به حلقه شما یه آرایه ی خالی دیگه درست کرده اید و اونایی که این مقدار http رو دارن دارید میریزید توش و در نهایت editedarray میشه نتیجه نهایی که شامل لینک های کامل هست. اون [] ها هم به این معنی هست که این مقدار رو به آرایه ی editedarray اضافه کن (در انتهای آرایه درج کن. push).

با رجکس میشه به این صورت نوشت:


<?php
$editedarray = array();
foreach( $matches as $key ){
if( preg_match( '/^(http://)/', $key ) ){
$editedarray[] = $key
}
}
?>

توی سایت regexr.com هم قسمت کامیونیتی برید کدهای خوبی پیدا می کنید. همچنین آموزش و معرفی کدهای regex رو هم قرار داده اند.

اما این نکته رو فراموش نکنید که regex آخرین راه حل هست و خیلی کندتر از strpos هست.

موفق باشید.

لینک به ارسال

به گفتگو بپیوندید

هم اکنون می توانید مطلب خود را ارسال نمایید و بعداً ثبت نام کنید. اگر حساب کاربری دارید، برای ارسال با حساب کاربری خود اکنون وارد شوید .

مهمان
ارسال پاسخ به این موضوع ...

×   شما در حال چسباندن محتوایی با قالب بندی هستید.   حذف قالب بندی

  تنها استفاده از 75 اموجی مجاز می باشد.

×   لینک شما به صورت اتوماتیک جای گذاری شد.   نمایش به صورت لینک

×   محتوای قبلی شما بازگردانی شد.   پاک کردن محتوای ویرایشگر

×   شما مستقیما نمی توانید تصویر خود را قرار دهید. یا آن را اینجا بارگذاری کنید یا از یک URL قرار دهید.

×
×
  • اضافه کردن...