preg_replace

edodi

New member
preg_replace

הי,
אם אני רוצה לקחת מחרוזת של תווים ולהשתיל סלאש / בין תו לתו
האם אני יכול לעשות את זה עם הפקודה הזאת?
כלומר כל אות להחליף באות עצמה ולהוסיף לה תו?

תודה :)
 

dckur

New member
דווקא עולה לי פתרון דרך str_replace

אבל הכי פשוט לעבור בלולאה... זה יהיה גם הפתרון היעיל ביותר.
 

shayfalador

New member
לא בטוח הכי יעיל, אולי explode-implode

preg_replace בטוח הכי לא יעיל, ביטויים רגולריים זה איטי.
str_replace יכול להיות טוב, וגם לולאה.
אני לא בטוח לגבי שניהם.

אולי שווה לנסות explode להכל ואז implode עם התו המתאים.
 

yoavks4

New member
כן, גם לי נראה

שיטת explode implode הכי נראית לי. תנסה כך:


$str = explode('',$str);
$str = implode('/',$str);
 

shayfalador

New member
למה לא לקצר ולחסוך הצבות ומשתנים?

$str = implode('/', explode('', $str));
 

edodi

New member
מצאתי פתרון

preg_replace('/(.)/', '$1/', $string);

אתם אומרים שזה יותר איטי?
 

shayfalador

New member
כמעט בטוח

ביטויים רגולריים זה מאוד מאוד איטי באופן יחסי.
אני אכתוב עכשיו benchmark ואציג את התוצאות.
 

shayfalador

New member
סיכום

קודם כל, לא ניתן לעשות explode עם פרמטר ריק, בשביל זה יש פונקציה שנקראת str_split שעושה בדיוק את זה.
כתבתי benchmark, שאפשר לראות אותו כאן (התוצאות בתגובה): https://gist.github.com/2472298
יש 4 תוצאות:
1. base - לא עושה כלום, רק כדי לדעת כמה זמן הולך על "זבל".
2. preg_replace.
3. str-split ואז implode.
4. loop פשוט שבונה את ה-string בשרשור.

התוצאות כך:
base: 0.022218942642212
preg_replace: 0.27821397781372
str_split-implode: 0.18439102172852
loop: 0.66747808456421

סה"כ: str_split-implode במקום הראשון, preg_replace במקום השני ובמקום האחרון loop.
 

bnayal

New member
נחמד איך שהעברת את הפונקציה בתור פרמטר,

תודה
 

dckur

New member
משהו פה מוזר...

אם למישהו יש כוח אפשר לכתוב פונקציה בסי שתעשה את זה ולחבר אותה לphp, ולהשוות

אין מצב שמעבר על מחרוזת בלופ לוקח כל כך הרבה זמן... מעניין למה זה מתורגם בסוף...
 

shayfalador

New member
זה רק כי זה ב-PHP

אל תשכח שגם הלולאה עצמה ב-PHP ולכן די איטית, ומעבר לזה יש המון פעולות שרשור.
אם היית ממש ב-C היית יוצר string בגודל 2n, אבל ב-PHP כל פעם יש הצהרה על string חדש לדעתי, כך שיש המון בזבוז של מקום.
אם היה אפשר להתשמש ב-SplFixedArray כאן זה כנראה היה מאוד יעיל ביחס לגרסה הזו.
 
למעלה