PDA

View Full Version : سوال: مشکل با str_replace



abolfazl-z
یک شنبه 08 اردیبهشت 1392, 20:58 عصر
سلام دوستان :لبخندساده:

دوستان یک مشکل عجیبی وجود داره :متفکر:
کد زیر را نگاه کنید :


$a = str_replace(' ',' ','a a a a');
echo $a .'<br>'; //output : a a a a
echo str_replace(' ','-',$a);//output a--a----a-a

دوستان خط دوم رو نگاه کنید تمامی space ها به یکی تبدیل شدن خوب تا اینجا درست.
خوب حالا در خط سوم می خواهم اون space های باقی مانده در متغیر a رو به '-' تبدیل کنم ولی چرا متغیر a همان مقدار قبلی رو دارد ؟؟؟؟ یعنی دوباره میشه
'a a a a' که اگر دقت کنید در خط سوم خروجی اینطور نشون میده که کاراکتر '-' با چندیدن space جایگزین شده که در واقع جواب باید بشه
'a-a-a-a' !!!:متفکر:

MRmoon
یک شنبه 08 اردیبهشت 1392, 21:28 عصر
$a = str_replace(' ','','a a a a');
echo $a .''; //output : a a a a
echo str_replace(' ','-',$a);//output a--a----a-a

درست شد؟

colors
یک شنبه 08 اردیبهشت 1392, 21:29 عصر
اگه دقت کنی خودت عینا نوشتی که آقا به جای space ها space بزار, خوب چه فرقی میکنه!! مثلا بگی اگه 1 بود, 2 بزار. خوب اگه ده تا 1 باشه ده تا 2 میزاره دیگه!
اینو ببین

# رشته موردنظر
$str = 'a a a a';
#کاراکتر جانشین اسپیس ها
$replace = '.';
$a = str_replace(' ','',$str);
$b = array();
for($i = 0; $i < mb_strlen($a, 'utf-8'); $i++){
$b[] = mb_substr($a, $i,1);
}
$final = '';
for($i = 0; $i < count($b); $i++){
if($i == 0){
$final .= $b[$i];
}
else{
$final .= $replace.$b[$i];
}
}
echo $final;

hidensoft
یک شنبه 08 اردیبهشت 1392, 21:37 عصر
:|
پی اچ پی کد می زنی دیگه ؟ بعد

echo str_replace(' ',' ','a a a a');

خروجیش می شه

output : a a a a
؟؟؟؟؟
اسپیس رو با اسپیس عوض کردی اتفاق خاصی باس میوفتاد ؟


$a = 'a a a a';
$a = preg_replace('!\s+!', '-', $a);
echo $a;



اگه دقت کنی خودت عینا نوشتی که آقا به جای space ها space بزار, خوب چه فرقی میکنه!! مثلا بگی اگه 1 بود, 2 بزار. خوب اگه ده تا 1 باشه ده تا 2 میزاره دیگه!
اینو ببین

# رشته موردنظر
$str = 'a a a a';
#کاراکتر جانشین اسپیس ها
$replace = '.';
$a = str_replace(' ','',$str);
$b = array();
for($i = 0; $i < mb_strlen($a, 'utf-8'); $i++){
$b[] = mb_substr($a, $i,1);
}
$final = '';
for($i = 0; $i < count($b); $i++){
if($i == 0){
$final .= $b[$i];
}
else{
$final .= $replace.$b[$i];
}
}
echo $final;
رگولار به درد همین جاها می خوره خب. از این که استفاده نمی کنی واقعا ؟

colors
یک شنبه 08 اردیبهشت 1392, 21:42 عصر
رگولار به درد همین جاها می خوره خب. از این که استفاده نمی کنی واقعا ؟

بیشتر هدف آشنای دستمون با الگوریتم اسپاگتیش بود, ولی حقیقتا نه استفاده نمیکنم.

abolfazl-z
یک شنبه 08 اردیبهشت 1392, 21:54 عصر
دوستان چرا دعوا دارین :لبخند:

بله اسپیس با اسپیس چرا نشه !!!!!!

دوستان با اینکار تمام اسپیس ها به یک اسپیس تبدیل میشه !

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


echo str_replace('1',' ','aa111111111aa');

تمامی یک ها به یک اسپیس تبدیل میشود.

-------------------------------------------------------------
مرسی hidensoft جان و بقیه دوستان

جوابم رو از کد زیر گرفتم :


$a = 'a a a a';
$a = preg_replace('!\s+!', '-', $a);
echo $a;


----------------------------------------
میشه یکم بیشتر درباره این کد توضیح بدهید ؟(بخصوص پارامتر اولی !\s+!):متفکر:

hidensoft
یک شنبه 08 اردیبهشت 1392, 21:59 عصر
دعوا کجا بود :))

دوستان با اینکار تمام اسپیس ها به یک اسپیس تبدیل میشه !
بعله حتمن :دی


میشه یکم بیشتر درباره این کد توضیح بدهید ؟(بخصوص پارامتر اولی !\s+!)
بحث رگولار اکسپرشن پیچیدست و زیاد. گوگل کن مقاله زیاده.

colors
یک شنبه 08 اردیبهشت 1392, 22:05 عصر
دوستان چرا دعوا دارین :لبخند:

بله اسپیس با اسپیس چرا نشه !!!!!!

دوستان با اینکار تمام اسپیس ها به یک اسپیس تبدیل میشه !

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


echo str_replace('1',' ','aa111111111aa');

تمامی یک ها به یک اسپیس تبدیل میشود.

-------------------------------------------------------------
مرسی hidensoft جان و بقیه دوستان

جوابم رو از کد زیر گرفتم :


$a = 'a a a a';
$a = preg_replace('!\s+!', '-', $a);
echo $a;


----------------------------------------
میشه یکم بیشتر درباره این کد توضیح بدهید ؟(بخصوص پارامتر اولی !\s+!):متفکر:

دوست عزیز, بله هر اسپیس فقط با یک اسپیس جایگزین میشه, و چون HTML دو یا چند space رو به عنوان یه space میبینه, پس خروجی شما چندتا اسپیس رو یک اسپیس نشون میده!
کد زیرو تست کن

$str = str_replace(' ', ' ','a a a a');
echo '<pre>'.$str.'</pre>';

abolfazl-z
یک شنبه 08 اردیبهشت 1392, 22:07 عصر
دعوا کجا بود :))

شوخی میکنم :X :بامزه:

مرسی از تمام دوستان :لبخندساده: :تشویق:

abolfazl-z
یک شنبه 08 اردیبهشت 1392, 22:10 عصر
دوست عزیز, بله هر اسپیس فقط با یک اسپیس جایگزین میشه, و چون HTML دو یا چند space رو به عنوان یه space میبینه, پس خروجی شما چندتا اسپیس رو یک اسپیس نشون میده!
کد زیرو تست کن

:D

خوب به من یکم حق بدین :(( چون من یک زبان دیگر که می خوندم اینطوری کار میکرد.

بازهم مرسی از تمام دوستان :لبخندساده:

MMSHFE
یک شنبه 08 اردیبهشت 1392, 23:54 عصر
$a = preg_replace('#(\s)+#', ' ', 'a a a a');
echo '<p>' . $a . '</p>' . PHP_EOL;
echo '<p>' . str_replace(' ', '-', $a) . '</p>' . PHP_EOL;

hidensoft
دوشنبه 09 اردیبهشت 1392, 00:00 صبح
یه بار preg یه بار replace :دی کدی که من گذاشتم ساده تره. پرفورمنسشم بهتره :دی

MMSHFE
دوشنبه 09 اردیبهشت 1392, 00:12 صبح
درسته. من فقط خواستم کد خودشون رو اصلاح کنم که بدونن کجای کار رو اشتباه کردن و چرا چند Space به یک Space تبدیل نشده وگرنه اگه بحث کوتاهی و Performance باشه، اینم کد خلاصه تر :لبخند: :

echo '<p>' . preg_replace('#(\s)+#', '-', 'a a a a') . '</p>' . PHP_EOL;

MMSHFE
دوشنبه 09 اردیبهشت 1392, 00:15 صبح
میشه یکم بیشتر درباره این کد توضیح بدهید ؟(بخصوص پارامتر اولی !\s+!):متفکر:
دستوری که گذاشته شده، داره میگیره هرجا یک یا چند (بخاطر +) کارکتر Whitespace مثل Enter و Space و Tab و... (بخاطر s\) دیدی، با - جایگزین کن. ! اول و آخر هم که میتونه هر کارکتر دیگری باشه، اصطلاحاً بهش میگن Delimiter که ابتدا و انتهای محدوده عبارت با قاعده رو مشخص میکنه.