PDA

View Full Version : [کار با رشته ها] حذف رشته ای از رشته ی دیگر



ghiravani
یک شنبه 22 اسفند 1389, 20:11 عصر
سلام به همگـــــــــــــی

دوستان چجوری میشه یک رشته رو از رشته ی دیگه حذف کرد؟

مثلا دو رشته ما این هست:


$str1="He is doctor.is he teacher?he can open the window.";
$str2="He is doctor.";

حالا چطور میشه

$str2
رو از رشته

$str1
حذف کرد؟

ممنون

ghiravani
یک شنبه 22 اسفند 1389, 20:17 عصر
دوستان خودم جوابم رو پیدا کردم.


<?php

$str3="I am student.Are you teacher?No I am student.";
$str1="I am student.";
echo $str3."<br>";
echo $str1."<br>";
$str2="";

$str3=str_replace($str1,$str2,$str3);
echo $str3."<br>";

?>

اگر کسی راه بهتری میدونه ، به ما هم کمک کنه.

ممنون

king-net
یک شنبه 22 اسفند 1389, 20:28 عصر
فکر نکنم تابع خاصی باشه که ازش بشه استفاده کرد یا من ندیدم.
فک کنم از str_replace بشه استفاده کرد که اینم دردسر های خودش رو داره.

ghiravani
یک شنبه 22 اسفند 1389, 23:25 عصر
خدایا

من دقت نکردم.تابع
str_replace بصورت زیر هست:


str_replace(str1,str2,str3);

که اگر زیر رشته str1 در str3 پیدا شد ، این تابع بجای str1 ، مقدار str2 رو جایگزین میکنه.
یک خوبی داره ولی یک بدی بزرگ تر.
اگر رشته ها اینطوری باشه:


$str3="I am student.Are you teacher?No I am student.";
$str1="I am student.";
$str2="";

این تابع میاد بجای "I am student" مقدار str2 رو در تمام رشته str3 جایگزین میکنه!!! نمیشه فقط برای قسمت ابتدای رشته جایگزین کنه اما قسمت انتهایی تغییر نکنه؟؟
راه دیگه ای نداره؟؟

ممنون

$ M 3 H R D A D $
یک شنبه 22 اسفند 1389, 23:44 عصر
<?php

$str="I am student.Are you teacher?No I am student.";
$text="I am student.";

echo str_replace($text,"",$str);

?>

$ M 3 H R D A D $
یک شنبه 22 اسفند 1389, 23:45 عصر
کارت باید با substr_replace تو لینک http://php.net/manual/en/function.substr-replace.php حل بشه ظاهرا!

ghiravani
یک شنبه 22 اسفند 1389, 23:48 عصر
خروجی این کد ، اینه:
Are you teacher?No

اما باید خروجی اینطوری باشه:
Are you teacher?No I am student.

مشکل اینه که در جمله اصلی ، دوبار "I am student" تکرار شده و من میخوام فقط "I am student" اولی تغییر کنه

ممنون

امیـرحسین
دوشنبه 23 اسفند 1389, 00:02 صبح
مثالی که شما میزنید اصلا جامع نیستید اگر منظورتون اینه که فقط نمونه اول حذف بشه، تابع str_replace تعداد یا count هم میگیره. یعنی میشه گفت فقط یک مورد رو تغییر بده...

ghiravani
دوشنبه 23 اسفند 1389, 00:15 صبح
من میخوام این جمله زیر رو که داخل رشته قرار دادم:
I am student.Are you teacher?No I am student.

برنامه از ابتدای جمله شروع کنه و اولین باری که "I am student" در جمله پیدا شد ، بجاش "" قرار بده.همین
اما مشکل اینه که تابع
str_replace
همون طور که در پست #4 توضیح دادم ، خروجی رو اینطوری نشون میده که بدرد کار من نمیخوره:
Are you teacher?No

ممنون

ghiravani
دوشنبه 23 اسفند 1389, 00:37 صبح
str_replace ( mixed $search , mixed $replace , mixed $subject [, int &$count ] )

مقدار count که گفتید ، تعداد $search هست که در رشته $subject تکرار شده و count خروجی تابع هست ، نه ورودی!

ممنون

tehro0n
پنج شنبه 25 اسفند 1390, 04:19 صبح
function str_replace_once($str_pattern, $str_replacement, $string){

if (strpos($string, $str_pattern) !== false){
$occurrence = strpos($string, $str_pattern);
return substr_replace($string, $str_replacement, strpos($string, $str_pattern), strlen($str_pattern));
}

return $string;
}

MMSHFE
پنج شنبه 25 اسفند 1390, 13:38 عصر
این تابع رو که نوشتم ببینید:


function str_replace_once($text, $search, $replace, $occurance = 1, $ci = false) {
if(empty($occurance)) {
$occurance = 1;
}
$pos = -1;
if(!$ci) {
if(strpos($text, $search) === false) {
return $text;
}
for($i = 0; $i < $occurance; $i++) {
$pos = strpos($text, $search, $pos + 1);
}
$len = strlen($search);
return substr($text, 0, $pos).$replace.substr($text, $pos + $len);
}
else {
if(stripos($text, $search) === false) {
return $text;
}
for($i = 0; $i < $occurance; $i++) {
$pos = stripos($text, $search, $pos + 1);
}
$len = strlen($search);
return substr($text, 0, $pos).$replace.substr($text, $pos + $len);
}
}

پارامترهای تابع به ترتیب:
1- رشته اصلی
2- رشته مورد جستجو
3- رشته جایگزین
4- چندین تکرار باید جایگزین شود؟
5- عدم حساسیت تابع به حروف بزرگ و کوچک
چند مثال از نحوه اجرای تابع:


$text = 'I am a student. Are you a teacher? No, I am a student.';

$search = 'student';
$replace = 'nurse';

// Remove 1st occurance of search string (case-sensitive)
echo '<p>'.str_replace_once($text, $search, $replace).'</p>'.PHP_EOL;
// Remove 2nd occurance of search string (case-sensitive)
echo '<p>'.str_replace_once($text, $search, $replace, 2).'</p>'.PHP_EOL;

$search = 'Student';
// Remove 1st occurance of search string (case-sensitive)
echo '<p>'.str_replace_once($text, $search, $replace).'</p>'.PHP_EOL;
// No replace is done because Student with Capital "S" is not within the string

// Remove 1st occurance of search string (case-insensitive)
echo '<p>'.str_replace_once($text, $search, $replace, 1, true).'</p>'.PHP_EOL;
// The replace is done because now, the function is case-insensitive

خروجی:


I am a nurse. Are you a teacher? No, I am a student.
I am a student. Are you a teacher? No, I am a nurse.
I am a student. Are you a teacher? No, I am a student.
I am a nurse. Are you a teacher? No, I am a student.
البته میتونید تابع رو باز هم گسترش بدین (مثلاً از بشه مشخص کنیم از کدوم تکرار کلمه شروع کنه و چندتا مورد تکرار بعدش رو جایگزین کنه). موفق باشید.