سوال php

aminchuchulu

New Member
سلام
من دارم یه اسکریپت مینویسم
حالا به جایی رسیدم که
باید هرجایی عکس بود
به جای عکس، ادرس عکس رو به یه تابع بده و اون روش یه کم پروسس انجام بده و نتیجه اون پردازش ها به جای خود عکس نمایش داده بشه

کدی که نوشتم اینه
PHP:
<?php

$body = '<br><img src="http://php.net/images/php_snow_2008.gif" /><br>';

function img_ws($url) {
/*
کدهای مربوط به تابع
*/
return $url;
}

echo preg_replace('(<img [^<]*src=["|\']?([^ "\']*)["|\']?[^>]*>)', img_ws("$1"), $body);

?>
وقتی که توی فانکشن کار خاصی انجام ندیم و مثل کدی که بالا گذاشتم صاف آرگومان ورودی روچیز کنی (return) درست کار میکنه.. یعنی انگار که متن درست که همون آدرس عکس هست به تابع فرستاده شده
اما وقتی روی آرگومانی که به تابع داده میشه یه پروسس انجام بدیم اونوقت $1 رو به عنوان آرگومان فرض میکنه نه آدرس عکس رو
برای تست کد پایین رو اجرا کنین

PHP:
<?php

$body = '<br><img src="http://php.net/images/php_snow_2008.gif" /><br>';

function img_ws($url) {
$url = file_get_contents($url);
return $url;
}

echo preg_replace('(<img [^<]*src=["|\']?([^ "\']*)["|\']?[^>]*>)', img_ws("$1"), $body);

?>
خب.. وقتی اینو اجرا میکنیم
این خطارو میده
کد:
Warning: file_get_contents($1) [function.file-get-contents]: failed to open stream: No such file or directory in F:\Apache2\htdocs\amin.php on line 26
و این یعنی که به جای http://php.net/images/php_snow_2008.gif مقدار $1 به تابع file_get_contents فرستاده شده :(

پ.ن بیربط: تابع file_get_contents رو همینجوری از خودم در کردم.. تو هنگم الان... تابع دیگه ای به ذهنم نرسید
 

aminchuchulu

New Member
اره همینه
تنها فرقش توی کد html ای هست که ریختم تو متغیر body
اونی که توی amin.php بود یه کوجولو طولانی تر تر بود
اون کدهاش بیشتره و به همین خاطر اونجا خطی که ارور داشته 26 بوده.. اگه شما این کد رو اجرا کنین از یه خط دیگه خطا میگیره (اما از همون قسمت از کد)
البته وقتی که این مشکل برطرف بشه کدهای تابع img_ws عوض میشه...
پ.ن: چه تیزبین !
 
آخرین ویرایش:

Masoud1365

مدیر انجمن
شما اگر که عکس رو میخوایی بگیری بهتره این آدرس رو بگیری
PHP:
images/php_snow_2008.gif
این آدرسی که شما نوشتید رو به صورت رشته دریافت میکنه و عکست شناسایی نمیشه !

موفق باشید
 

aminchuchulu

New Member
عکس روی سرور من نیست پی نمیتونم اونمدلی آدرس بدم

اینی که دارم مینویسم قراره به صورت یه افزونه برای وردپرس بشه
وقتی مطلب ارسال میشه
خودکار عکس هارو بیاره روی سرور خودمون و حجمشو بهینه کنه و سایزشم اگه بزرگتر از اندازه خاصی بود کمتر کنه و واترمارک هم بزنه آدرس جدید عکس که روی سرور خودمون هست و اون کارها روش انجام شده رو جایگزین آدرس قبلی عکس کنه

PHP:
preg_replace('(<img [^<]*src=["|\']?([^ "\']*)["|\']?[^>]*>)', img_ws("$1"), $body);

با این کد عکس ها شناسایی میشن و آدرسشون به تابع img_ws داده میشه تا این تابع کارهایی رو که گفتمو
انجام بده و نتیجه رو به تابع preg_replace بده تا جایگزین آدرس قبلی عکس بشه
ولی متاسفانه به جای آدرس عکس
متن $1 به تابع img_ws فرستاده میشه و این کار رو خراب میکنه

در حالی که اگه ما فرضا بخوایم همه عکس هارو به لینک تبدیل کنیم که نمایش داده نشه و کاربر هرکدوم رو
که خواست ببینه کلیک کنه
میتونیم از کد پایین استفاده کنیم
PHP:
preg_replace('(<img [^<]*src=["|\']?([^ "\']*)["|\']?[^>]*>)', '<a href="$1">IMAGE</a>', $body);
و اینجا متن $1 آدرس عکس رو بر می گردونه ولی وقتی به تابع میدیمش ...

این اسکریپت هم به صورت افزونه ای هست که خودش رو به تابعی که توی وردپرس مسئول ثبت پست توی
دیتابیس هست میچسبونه تا قبل از اینکه پست توی دیتابیس ثبت بشه تغییراتی که گفتم رو انجام بده و چیزی
رو به کاربر نشون نمیده که به کمک جاوااسکریپت این کار انجام بشه و باید
با پی اچ پی باشه
 

aminchuchulu

New Member
من توی یه انجمن دیگه هم این سوالو مطرح کردم و جوابی نگرفتم
ظاهرا راه بدی رو برای رسیدن به هدفم انتخاب کردم و تابع preg_replace توانایی انجام چیزی که میخوامو نداره..
(هرچند که کدها ظاهرا مشکلی ندارن)

اگه ممکنه کمکم کنید آدرس عکس هارو توی یه آرایه بریزم و اون آرایه رو به یه تابعی که مینویسم بدم تا
روی تک تک مقادیری که داخلش هست (همون آدرس عکس ها)
اون کارایی که گفتمو انجام بده و با یه ریپلیس معمولی آدرس قبلی رو توی متن پیدا کنه و آدرس جدید که تابع ایجاد کرده
رو جایگزینش کنه

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

eAmin

Well-Known Member
سلام.

به اینصورت کدتون رو تغییر بدید، و نتیجه رو اعلام کنید:
PHP:
preg_replace('(<img [^<]*src=["|\']?([^ "\']*)["|\']?[^>]*>)', "img_ws('$1')", $body);
شما وقتی دارید img_ws رو به عنوان یک تابع به preg_replace پاس می دید، این تابع فکر می کنه که شما عملیات خاصی رو روی رشته ی مورد نظر از طریق img_ws انجام می دید!
مشکلی که پیش می یاد رو خودتون هم دیدید، php در این حالت فکر می کنه که شما img_ws رو در خارج از preg_replace اجرا کردید.

برای اینکار شما، بنده پیشنهاد می کنم که از این تابع که به همین منظور بکار می ره استفاده کنید:
http://ir.php.net/manual/en/function.preg-replace-callback.php

موفق باشید.
-----------------
مثل اینکه خودتون مشکلتون رو برطرف کردید، بنده دیر جواب دادم.
ببخشید.
 
آخرین ویرایش:

aminchuchulu

New Member
متشکرم دوست من
کدی که دادین کار نکرد
یعنی اصلا کاری با تابع نداشت و مثل یه رشته باهاش رفتار کرد
و خروجی داد img_ws('http://php.net/images/php_snow_2008.gif')

در صمن
با همون تابعی که گفتین مشکلم رو برطرف کردم
و دیگه لزومی به ادامه بحث نیست
 

eAmin

Well-Known Member
و دیگه لزومی به ادامه بحث نیست
موافقم.

ولی برای اینکه برای دیگر دوستان این مسئله روشن بشه، شما می تونید همون رشته ای که تولید شده با استفاده ار تابع eval اجراش کنید، همونطور که می بینید، همون چیزی رو که می خواید، برای شما تولید کرده.

خوش باشید.
 

جدیدترین ارسال ها

بالا