PDA

View Full Version : سوال: چگونه src یک عکس رو از یک متن html بدست بیاوریم ؟ (حل شد + آپلود عکسهای Remote و Local)



pirmard66
جمعه 19 مهر 1392, 14:55 عصر
سلام و عرض ادب

ما یه متن html داریم.

که داخل یک متغیر ریختیمش.

حالا میخواهیم هرچی عکس داخل اون متغیر هست src شون رو بدست بیاوریم و تغییر دهیم.

تغییر دادنشون رو بلدم..

فقط نمیدونم چطوری بدست میاد...

میخوام داینامیک باشه. (جاوا نباشه)

ممنون میشم کمک کنید.

SilverLearn
جمعه 19 مهر 1392, 15:25 عصر
اینجا می تونه بهت کمک کنه :




http://stackoverflow.com/questions/18450767/detect-and-extract-image-url-from-text-and-html-tags

pirmard66
جمعه 19 مهر 1392, 15:57 عصر
متاسفانه چیزی متوجه نشدم...


همچنان منتظرم دوستان...

AliRezaPro
جمعه 19 مهر 1392, 18:17 عصر
یه همچین چیزی ؟

$str = '<img border="0" src=\'/images/image.jpg\' alt="Image" width="100" height="100"/>';

preg_match('/(src=["\'](.*?)["\'])/', $str, $match); //find src="X" or src='X'
$split = preg_split('/["\']/', $match[0]); // split by quotes

$src = $split[1]; // X between quotes

echo $src;

با کتابخانه ی DOM به راحتی میتوانید این کارو انجام دهید

http://php.net/dom
مثال :

$html = str_get_html('…');
foreach ($html->find('img[src]') as $img) {
echo $img->getAttribute('src');
}
البته این کار براحتی با jquery قابل انجام هست

pirmard66
شنبه 20 مهر 1392, 07:47 صبح
ممنون دوست من...

میشه روش jquery را هم توضیح بدید؟

MMSHFE
شنبه 20 مهر 1392, 10:10 صبح
DOM خیلی سنگینه و مصرف حافظه خیلی زیادی داره. بهتره برای اینجور کارهای راحت، از RegEx استفاده کنید:


$matches = array();
if(preg_match_all('#<img.*?src=["|\'](.*?)["|\'][^>]*>#i', $html, $matches)) {
print_r($matches[1]);
}

pirmard66
شنبه 20 مهر 1392, 13:25 عصر
ممنون آقای شهرکی مشکل حل شد.

فقط دو نکته :

اول : حالا چطوری بیارم بیرون از array ؟

ببینید من قصدم اینه که بتونم src رو در بیارم و با این کد آپلود کنم تو هاست:



// UPLOAD.PHP
if($_POST["submit"]){
$url = trim($_POST["url"]);
if($url){
$file = fopen($url,"rb");
if($file){
$directory = "./New Folder/"; // Directory to upload files to.
$valid_exts = array("jpg","jpeg","gif","png"); // default image only extensions
$ext = end(explode(".",strtolower(basename($url))));
if(in_array($ext,$valid_exts)){
$rand = rand(1000,9999);
$filename = $rand . basename($url);
$newfile = fopen($directory . $filename, "wb"); // creating new file on local server
if($newfile){
while(!feof($file)){
// Write the url file to the directory.
fwrite($newfile,fread($file,1024 * 8),1024 * 8); // write the file to the new directory at a rate of 8kb/sec. until we reach the end.
}
echo 'File uploaded successfully! You can access the file here:'."\n";
echo ''.$directory.$filename.'';
} else { echo 'Could not establish new file ('.$directory.$filename.') on local server. Be sure to CHMOD your directory to 777.'; }
} else { echo 'Invalid file type. Please try another file.'; }
} else { echo 'Could not locate the file: '.$url.''; }
} else { echo 'Invalid URL entered. Please try again.'; }
}


نظرتون رو درباره کد آپلود هم بگید !

دوم :

مقاله ای آموزشی فارسی برای regex هست ؟

ممنون میشم معرفی کنید.

با تشکر فراوان

SilverLearn
شنبه 20 مهر 1392, 14:05 عصر
مقاله ای آموزشی فارسی برای regex هست ؟


اینجا آموزش رو گذاشتم البته کامل ترش میکنم...

http://www.silverlearn.ir/thread134.html

pirmard66
شنبه 20 مهر 1392, 19:15 عصر
ممنون آقای شهرکی مشکل حل شد.

فقط دو نکته :

اول : حالا چطوری بیارم بیرون از array ؟

ببینید من قصدم اینه که بتونم src رو در بیارم و با این کد آپلود کنم تو هاست:



// UPLOAD.PHP
if($_POST["submit"]){
$url = trim($_POST["url"]);
if($url){
$file = fopen($url,"rb");
if($file){
$directory = "./New Folder/"; // Directory to upload files to.
$valid_exts = array("jpg","jpeg","gif","png"); // default image only extensions
$ext = end(explode(".",strtolower(basename($url))));
if(in_array($ext,$valid_exts)){
$rand = rand(1000,9999);
$filename = $rand . basename($url);
$newfile = fopen($directory . $filename, "wb"); // creating new file on local server
if($newfile){
while(!feof($file)){
// Write the url file to the directory.
fwrite($newfile,fread($file,1024 * 8),1024 * 8); // write the file to the new directory at a rate of 8kb/sec. until we reach the end.
}
echo 'File uploaded successfully! You can access the file here:'."\n";
echo ''.$directory.$filename.'';
} else { echo 'Could not establish new file ('.$directory.$filename.') on local server. Be sure to CHMOD your directory to 777.'; }
} else { echo 'Invalid file type. Please try another file.'; }
} else { echo 'Could not locate the file: '.$url.''; }
} else { echo 'Invalid URL entered. Please try again.'; }
}


نظرتون رو درباره کد آپلود هم بگید !

دوم :

مقاله ای آموزشی فارسی برای regex هست ؟

ممنون میشم معرفی کنید.

با تشکر فراوان

من همچنان منتظرم

با تشکر

pirmard66
یک شنبه 21 مهر 1392, 12:08 عصر
دوستان کسی راهنمایی نمیکنه؟

AliRezaPro
یک شنبه 21 مهر 1392, 22:32 عصر
اول : حالا چطوری بیارم بیرون از array ؟

همچین چیزی می خواهید :

$matches[1][0]
.
.
.

همانند آرایه دوبعدی رفتار کنید

pirmard66
یک شنبه 21 مهر 1392, 23:10 عصر
میشه بیشتر توضیح بدید؟

چطوری میتونم دونه دونه عکس هایی که تو متن html هست رو با اون کد آپلود کنم؟

راستی نظرتون راجع کد آپلود تو هاست چیه؟

AliRezaPro
دوشنبه 22 مهر 1392, 01:57 صبح
در مورد آپلود عکس کمی جستجو بفرمایید . در یکی از تاپیک های جناب شهرکی توضیح کامل دادند . نحوه ی دسترسی رو که براتون کد گراشتم . میتوانید از اندیس 0 تا n برای دسترسی به آدرس ها استفاده کنید

pirmard66
دوشنبه 22 مهر 1392, 22:02 عصر
ممنون

من گذاشتم تو حلقه

ولی فقط src دوتا عکس اول رو نمایش میده در حالی که 10 تا عکس دارم :

حلقه :



$i = 0;
while ($i < count($matches)) {
$a = $matches[1][$i];
echo $a ."<hr >";
echo count($matches);
$i++;
}

MMSHFE
سه شنبه 23 مهر 1392, 00:31 صبح
$matches = array();
if(preg_match_all('#<img.*?src=["|\'](.*?)["|\'][^>]*>#i', $html, $matches)) {
foreach($matches[1] as $id => $src) {
echo "<p>Source #{$id} : {$src}</p>" . PHP_EOL;
}
}

pirmard66
چهارشنبه 24 مهر 1392, 19:15 عصر
ممنون

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



$html = <<<EOT
<img style="border:1px #000" src="3.jpeg" />
<a href="1.php" target="_blank">First Script</a>


<p><img src="9.jpeg" /></p>
<img style="border:1px #000" src="39.jpeg" />


<a href="2.php" target="_blank">Second Script</a>

EOT;
echo "<hr >";

$matches = array();
if(preg_match_all('#<img.*?src=["|\'](.*?)["|\'][^>]*>#i', $html, $matches)) {
foreach($matches[1] as $id => $src) {

$url = $src;
if($url){
$file = fopen($url,"rb");
if($file){
$directory = "./New Folder/"; // Directory to upload files to.
$valid_exts = array("jpg","jpeg","gif","png"); // default image only extensions
$ext = end(explode(".",strtolower(basename($url))));
if(in_array($ext,$valid_exts)){
$rand = rand(1000,9999);
$filename = $rand . basename($url);
$newfile = fopen($directory . $filename, "wb"); // creating new file on local server
if($newfile){
while(!feof($file)){
// Write the url file to the directory.
fwrite($newfile,fread($file,1024 * 8),1024 * 8); // write the file to the new directory at a rate of 8kb/sec. until we reach the end.

}

//echo ''.$directory.$filename.'';
}
}
}
}

$mmsrc=''.$directory.$filename.'';
$html = preg_replace('#<img(.*?)src=([^>]*?)>#i', '<img $1src="'.$mmsrc.'">', $html);

}

}
echo $html;



هدف :

میخوام عکس ها رو بگیرم ، آپلود کنم ، دوباره src جدید رو جانشین src قبلی کنم ..

ولی الان با این کدی که اوکی کردم عکس های موجود در متن html رو میگیره و آپلود میکنه ولی فقط src یکی رو جانشین همه src های موجود در متن html میکنه.

راستی آیا این کد مشکلی برای آپلود عکس در هاست نداره؟

ممنون میشم راهنمایی کنید.

MMSHFE
چهارشنبه 24 مهر 1392, 20:21 عصر
اینو چک کنید، همینطوری نوشتم راستش فرصت نشد تستش کنم:


<?php
function SafeUpload($name) {
if(!file_exists($name)) {
return false;
}
$allowedExtensions = array ('.bmp', '.gif', '.jpeg', '.jpg', '.png');
$dotPos = strrpos($name, '.');
$ext = ($dotPos !== false ? strtolower(substr($name, $dotPos)) : '');
$path = './New Folder/';
$in = '';
$out = '';
switch($ext) {
case '.bmp':
$in = 'ImageCreateFromWBMP';
$out = 'ImageWBMP';
break;
case '.gif':
$in = 'ImageCreateFromGIF';
$out = 'ImageGIF';
break;
case '.jpeg':
case '.jpg':
$in = 'ImageCreateFromJPEG';
$out = 'ImageJPEG';
break;
case '.png':
$in = 'ImageCreateFromPNG';
$out = 'ImagePNG';
break;
}
if($in == '' || $out == '') {
return false;
}
$src = $in($name);
$height = ImageSY($src);
$width = ImageSX($src);
$dst = ImageCreateTrueColor($width, $height);
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
do {
$fn = Rand(1000, 9999) . basename($file);
} while(file_exists($path . $fn));
$out($dst, $path . $fn);
ImageDestroy($dst);
ImageDestroy($src);
return $path . $fn;
}
$html = <<<EOT
<img style="border:1px #000" src="3.jpeg" />
<a href="1.php" target="_blank">First Script</a>
<p><img src="9.jpeg" /></p>
<img style="border:1px #000" src="39.jpeg" />
<a href="2.php" target="_blank">Second Script</a>
EOT;
echo '<hr />';

$matches = array();
if(preg_match_all('#<img.*?src=["|\'](.*?)["|\'][^>]*>#i', $html, $matches)) {
foreach($matches[1] as $src) {
$filename = SafeUpload($src);
if($filename !== false) {
$html = preg_replace("#<img(.*?)src=['|\"]?{$src}['|\"]?([^>]*)>#i", '<img$1src="' . $filename . '" />', $html);
}
}
}
echo $html;
?>

اگه جایی سؤال بود بفرمایید توضیح بدم ولی فکر کنم کدش واضح باشه. ضمناً این روش آپلود امنیت بیشتری داره. اگه احیاناً جایی خطا داشت هم بگین درستش کنم.

pirmard66
چهارشنبه 24 مهر 1392, 20:34 عصر
آقای شهرکی ممنونم..ولی یه خطا میگه داره...

( ! ) Parse error: syntax error, unexpected '{', expecting ';' in H:\local\wamp\www\uppppppppadresss\index.php on line 42


اما هرچی گشتم اینو } پیدا نکردم که مشکل داشته باشه...

MMSHFE
چهارشنبه 24 مهر 1392, 20:43 عصر
آخر خط 42 به اشتباه بجای ; کارکتر } تایپ شده بود. کد رو اصلاح کردم.

pirmard66
چهارشنبه 24 مهر 1392, 20:50 عصر
با تشکر فراوان

آقای شهرکی ببخشید الان آپلود نمیکنه جانشین هم نمیکنه ... .

MMSHFE
چهارشنبه 24 مهر 1392, 22:35 عصر
این کد نمونه رو دانلود کنید. تست کردم و کامل کار میکرد.
لینک (http://uplod.ir/sp2c9my7y1su/test.zip.htm)

pirmard66
چهارشنبه 24 مهر 1392, 23:59 عصر
آقای شهرکی روی عکس خارجی تست کردید؟

کار نمیکنه!

من آدرس عکس از سایت ها میدم اصلا آپلود نمیکنه!

مثال :



$html = <<<EOT
<img style="border:1px #000" src="http://t2.amedia.ir/images/docs/000202/202057/images/450x290x312116_488.jpg.pagespeed.ic.Cnn23LC4fJ.jpg" />
<a href="1.php" target="_blank">First Script</a>
<p><img src="http://t1.amedia.ir/images/docs/000202/202057/images/x4,281,29.jpg.pagespeed.ic.do4l4KiylZ.jpg" /></p>
<img style="border:1px #000" src="http://t3.amedia.ir/images/docs/000202/202072/images/600x400x422932_438.jpg.pagespeed.ic.DHfemOnUNT.jpg" />
<a href="2.php" target="_blank">Second Script</a>
EOT;
واسه سایت های دیگه هم همینطور...

فقط داخل لوکال هاست و عکس های داخل کامپیوتر کار میکنه...

ممنونم از وقتی که میگذارید...خداقوت

MMSHFE
پنج شنبه 25 مهر 1392, 07:36 صبح
بفرمایید این یکی دیگه خیلی کامل شد! عکسهای سایتهای دیگه رو هم براتون دانلود میکنه:


<?php
function SafeUpload($name) {
if(preg_match('#^http[s]?://#i', $name)) {
// Download the image
$photo = end(explode('/', trim($name, ' /')));
$ch = curl_init();
curl_setopt($ch, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch, CURLOPT_HEADER, false);
curl_setopt($ch, CURLOPT_MAXREDIRS, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_URL, trim($name));
curl_setopt($ch, CURLOPT_USERAGENT, 'GoogleBot');
$raw = curl_exec($ch);
if($fp = fopen($photo, 'w')) {
fwrite($fp, $raw);
fclose($fp);
}
$name = $photo;
}
if(!file_exists($name)) {
return false;
}
$allowedExtensions = array ('.bmp', '.gif', '.jpeg', '.jpg', '.png');
$dotPos = strrpos($name, '.');
$ext = ($dotPos !== false ? strtolower(substr($name, $dotPos)) : '');
$path = './New Folder/';
$in = '';
$out = '';
switch($ext) {
case '.bmp':
$in = 'ImageCreateFromWBMP';
$out = 'ImageWBMP';
break;
case '.gif':
$in = 'ImageCreateFromGIF';
$out = 'ImageGIF';
break;
case '.jpeg':
case '.jpg':
$in = 'ImageCreateFromJPEG';
$out = 'ImageJPEG';
break;
case '.png':
$in = 'ImageCreateFromPNG';
$out = 'ImagePNG';
break;
}
if($in == '' || $out == '') {
return false;
}
$src = $in($name);
$height = ImageSY($src);
$width = ImageSX($src);
$dst = ImageCreateTrueColor($width, $height);
ImageCopy($dst, $src, 0, 0, 0, 0, $width, $height);
do {
$fn = Rand(1000, 9999) . basename($name);
} while(file_exists($path . $fn));
$out($dst, $path . $fn);
ImageDestroy($dst);
ImageDestroy($src);
unlink($name);
return $path . $fn;
}
$html = <<<EOT
<img style="border:1px #000" src="http://t2.amedia.ir/images/docs/000202/202057/images/450x290x312116_488.jpg.pagespeed.ic.Cnn23LC4fJ.jpg" />
<a href="1.php" target="_blank">First Script</a>
<p><img src="http://t1.amedia.ir/images/docs/000202/202057/images/x4,281,29.jpg.pagespeed.ic.do4l4KiylZ.jpg" /></p>
<img style="border:1px #000" src="http://t3.amedia.ir/images/docs/000202/202072/images/600x400x422932_438.jpg.pagespeed.ic.DHfemOnUNT.jpg" />
<a href="2.php" target="_blank">Second Script</a>
<img style="border:1px #000" src="3.jpeg" />
<a href="1.php" target="_blank">First Script</a>
<p><img src="9.jpeg" /></p>
<img style="border:1px #000" src="39.jpeg" />
<a href="2.php" target="_blank">Second Script</a>
EOT;
echo '<hr />';

$matches = array();
if(preg_match_all('#<img.*?src=["|\'](.*?)["|\'][^>]*>#i', $html, $matches)) {
foreach($matches[1] as $src) {
$filename = SafeUpload($src);
if($filename !== false) {
$html = preg_replace("#<img(.*?)src=['|\"]?{$src}['|\"]?([^>]*)>#i", '<img$1src="' . $filename . '"$2/>', $html);
}
}
}
echo $html;
?>

pirmard66
پنج شنبه 25 مهر 1392, 08:26 صبح
آقای شهرکی بسیار ممنونم...

واقعا دیدم دکمه تشکر برای این وقتی که شما گذاشتید کافی نبود...
با تشکر از تمام زحماتتان.

الان به درستی کار میکنه...

بازم ممنونم..

البته هنوز داخل هاست تست نکردم.اگه مشکلی اونجا داشت حتما مزاحمتون میشم.

با تشکر

pirmard66
پنج شنبه 25 مهر 1392, 10:52 صبح
سلام
این ارور هارو میده :

شاید curl هاست فعال نیست ؟

Warning: curl_setopt() [function.curl-setopt]: CURLOPT_FOLLOWLOCATION cannot be activated when safe_mode is enabled or an open_basedir is set in /*****/public_html/home/adre.php on line 8
Warning: file_exists() [function.file-exists]: open_basedir restriction in effect. File(/home/picb/44-7013312029_847.jpg) is not within the allowed path(s): (/***/:/tmp:/var/tmp:/usr/local/lib/php/) in /****/public_html/home/adre.php on line 59
Warning: imagejpeg() [function.imagejpeg]: open_basedir restriction in effect. File(/home/picb/9-7013312029_847.jpg) is not within the allowed path(s): (/home2/***:/tmp:/var/tmp:
/usr/local/lib/php/) in /home2/l*****/public_html/home/adre.php on line 60

تیکت زدم و جواب دادن که فعاله !

MMSHFE
پنج شنبه 25 مهر 1392, 12:40 عصر
نه cURL که فعاله. بخاطر open_basedir هست. باید بگین غیرفعالش کنن تا بتونید به فایلهای سایر هاستها دسترسی داشته باشین.

pirmard66
پنج شنبه 25 مهر 1392, 13:14 عصر
من این خط رو فالس کردم الان ارور نمیده...

curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);

ولی یه مشکلی داره اینه که همزمان هم داخل فولدری که مشحص کردیم عکس آپ میکنه هم داخل روت هاست ....

----داخل لوکال هاست هم همینطوره!

مشکل از کجاشه ؟

MMSHFE
پنج شنبه 25 مهر 1392, 19:55 عصر
مشکلی نداره. خودم عمداً عکس اصلی رو حذف نکردم. میتونید آخر تابع SafeUpload و قبل از دستور return این دستور رو بنویسید:

unlink($name);
تا فایل اصلی حذف بشه.

MMSHFE
پنج شنبه 25 مهر 1392, 21:37 عصر
کد پست 23 (http://barnamenevis.org/showthread.php?423295-%DA%86%DA%AF%D9%88%D9%86%D9%87-src-%DB%8C%DA%A9-%D8%B9%DA%A9%D8%B3-%D8%B1%D9%88-%D8%A7%D8%B2-%DB%8C%DA%A9-%D9%85%D8%AA%D9%86-html-%D8%A8%D8%AF%D8%B3%D8%AA-%D8%A8%DB%8C%D8%A7%D9%88%D8%B1%DB%8C%D9%85-%D8%9F&p=1897918&viewfull=1#post1897918) رو اصلاح کردم تا فایل اصلی رو حذف کنه.

pirmard66
جمعه 26 مهر 1392, 00:31 صبح
تشکر فراوان از آقای شهرکی...

مشکل حل شد فقط اون خط رو فالس کردم چون پشتیبانی هاست گفت چون امنیت هاست اشتراکی میاد پایین نمیتونیم open_basedir رو غیر فعال کنیم.

( curl_setopt($ch, CURLOPT_FOLLOWLOCATION, false);)

امید وارم با فالس کردن اون مشکلی پیش نیاد...

بازهم ممنونم

MMSHFE
جمعه 26 مهر 1392, 01:00 صبح
نه مشکل خاصی پیش نمیاد. فقط اگه بعضی سایتها طوری طراحی شده باشن که Redirect کنن به یه آدرس دیگه تا عکس رو نشون بدن، اسکریپت شما دیگه نمیتونه عکس رو پیدا کنه چون دنبال آدرسهای Redirect شده نمیره.