REPLACE היא פונקציה מאוד שימושית אשר משמשת להחלפת תת מחרוזת בתת מחרוזת אחרת בתוך מחרוזת קיימת.
תחביר כללי:
REPLACE (str,what2replace,replace_with_what,where2start,howmany,compare)
פירוט ארגומנטים
str (ארגומנט בחובה) הוא משתנה שיכיל מחרוזת שבה ארצה לערוך שינויים מסוג החלפה.
כמובן שבמקום שם המשתנה ניתן לכתוב את המחרוזת עצמה תחומה בגרשיים ["] משני צידיה. לדוגמא:
REPLACE ("abcd-bla c",what2replace,replace_with_what,where2start,howmany,compare)
what2replace (ארגומנט בחובה) הוא משתנה שיכיל את תת המחרוזת אותה נרצה להחליף.
כמובן שבמקום שם המשתנה ניתן לכתוב את תת המחרוזת תחומה בגרשיים משני צידיה. לדוגמא:
REPLACE (str,"bla",replace_with_what,where2start,howmany,compare
replace_with_what (ארגומנט בחובה) הוא משתנה שיכיל את תת המחרוזת שתושם במקום תת המחרוזות בstr ששוות לwhat2replace.
כמובן שבמקום שם המשתנה ניתן לכתוב את תת המחרוזת עצמה תחומה בגרשיים משני צידיה. לדוגמא:
REPLACE (str,what2replace,"pita",where2start,howmany,compare)
where2start (ארגומנט לא בחובה) הוא משתנה שמייצג את פוזיציית תחילת העבודה, כלומר מאיזה תו (כשסופרים מצד שמאל) יש להתחיל את החיפוש עבור what2replace. ברירת המחדל היא: 1 – בהתחלה
כמובן שבמקום שם המשתנה ניתן לכתוב את המספר עצמו. לדוגמא:
REPLACE (str,what2replace,replace_with_what,3,howmany,compare)
howmany (ארגומנט לא בחובה) הוא משתנה שמייצג את מספר הפעמים לביצוע ההחלפה. ברירת המחדל היא עד אין סוף, כלומר ללא הגבלה.
כמובן שבמקום שם המשתנה ניתן לכתוב את המספר עצמו. לדוגמא:
REPLACE (str,what2replace,replace_with_what,where2start,2,compare)
Compare (ארגומנט לא בחובה) מייצג את צורת ההשוואה (בעת החיפוש להחלפה). יש לו שלושה ערכים אפשריים:
- הערך 0 – מייצג השוואה מסוג בינארי, כלומר case sensetivity נאכף – אם תקליד בwhat2replace את הטקסט "sss” ובstr יהיה לך: “SSSbbb" דבר לא יוחלף מכיוון שבstr שלושת אותיות הS הן רישיות (Capital letters), ואילו בwhat2replace הן קטנות. הקוד הבינארי שלהם שונה לכן S וs הם לא אותם תווים בעצם.
- הערך 1 – מייצג השוואה טקסטית, שבה ישנה התעלמות מcase sensetivity – כלומר, ההפך מהערך 0. האותיות S (גדולה) וs (קטנה) הן בעצם אותם תווים. זהו גם ערך ברירת המחדל.
- הערך 2 - מייצג השוואה שמבוססת על מידע מתוך מסד נתונים (DB).
כמובן שבמקום המשתנה compare ניתן להזין ישירות את הערך בצורת מספר:
REPLACE (str,what2replace,replace_with_what,where2start,howmany,0)
דוגמא להבנה:
str = "booxa-co-il,asp-org-il"
what2replace = "-"
replace_with_what = "."
where2start = 4
howmany = 3
compare = 0
REPLACE (str,what2replace,replace_with_what,where2start,howmany,compare)
הקלט (str) הוא שתי כתובות אתרים מופרדות בפסיק שבמקום הנקודות בהן מופיעים מקפים, אני רוצה להחליף את המקפים האלו בנקודות (.), לכן הצבתי בwhat2replace את הקו המפריד ("-") ובreplace_with_what את הנקודה ("."). המחשב יתחיל לחפש קווים מפרידים החל מהפוזיציה הרביעית משמאל (כפי שמוגדר בwhere2start) – ז"א, באות "x", ויחפש שלושה מופעים (כפי שמוגדר בhowmany) של מקף תוך כדי התייחסות לcase sensitivity (כפי שמוגדר בcompare) – אולם התייחסות זו מיותרת כיוון שאנו עוסקים בהחלפת סימנים ולא בהחלפת אותיות.
הפלט יהיה:
xa.co.il,asp.org-il
שימו לב למקף שבין org ו-il - הוא לא הוחלף, רק שלושת המקפים לפניו הוחלפו (כיוון שהגדרנו בפונקציה, בhowmany, להחליף רק את השלוש הראשונים).
כפי שניתן לראות, המחרוזת "נחתכה" ושלושת האותיות הראשונות נעלמו. הסיבה לכך היא השימוש במשתנה WHERE2START אשר מורה להתחיל רק מהתו הרביעי (x).
שימו לב שהפונקציה replace אינה עושה כלום מלבד החזרת מחרוזת לאחר השינוי. כלומר: הערך בstr לא השתנה, ואילו לא הייתי משתמש בשיטה response.write גם לא הייתי מקבל כל פלט!
עד כאן החלק הבסיסי של הפונקציה.
מדוע כל כך חשובה הפונקציה הזו לתכנתים?
ברור שמי שרוצה להתעסק עם מחרוזות ולערוך בהם שינויים מסיבה זו אחרת – פשוט חייב את הפונקציה הזו.
אבל ישנם מספר מקרים פרטיים שהפונקציה הזו ממש דרושה. לדוגמא:
אם ננסה להכניס טקסט כמו "אתר הASP הטוב בארץ הוא asp.org.il" לDB לא תהיה לנו כלל בעיה היות ומדובר רק בתווים (א'-ת', A-Z) ובתו נקודה.
אולם תווים כמו גרשיים (") או גרש (') קצת יותר בעייתיים מכיוון שכאשר מכניסים אותם לDB בעזרת משפט SQL הם לא מתקבלים (אם ננסה לכתוב את התווים האלו ישירות באקסס לא תהיה לנו בעיה, כל התווים תקינים מבחינת אקסס).
כמו כן תווים אלו וגם התווים גדול מ, קטן מ (<>) הם תווים בעייתיים בעת השליפה – הם עלולים לשבש פקדי טופס.
על כן, נשתמש בREPLACE בעת ההכנסה לDB ונחליף את התווים הבעייתיים בייצוג אסקי או בתווי HTML שמורים.
מקרים שכיחים:
| שם | ייצוג ויזואלי | ייצוג ב-VBS | הייצוג האסקי | הייצוג בתווי HTML שמורים | הבעייתיות | הפתרון |
| גרשיים | " | chr(34) | " | " | בעיה בהכנסה לDB עם insert של SQL תכנת השרת מזהה את התו כסוף משפט הSQL.בעת שליפה מהDB לתוך פקד טופס מסוג טקסט, הדפדפן עלול לזהות תווים אלו בתור גרש\יים סוגרים לvalue. | לפני ההכנסה לDB נחליף את התו באחד הייצוגים שלו: replace(str,chr(34),""") |
| גרש | ' | chr(39) | ' | ´ | לפני ההכנסה לDB נחליף את התו באחד הייצוגים שלו: replace(str,chr(39),"'") |
| גדול מ | < | chr(62) | > | > | בעת השליפה מהDB לתוך פקד טופס מסוג טקסט, הדפדפן עלול לזהות תווים אלו בתור סוגרים של תגית input. | לפני ההכנסה לDB נחליף את התו באחד הייצוגים שלו: replace(str,chr(62),">") |
| קטן מ | > | chr(60) | < | < | לפני ההכנסה לDB נחליף את התו באחד הייצוגים שלו: replace(str,chr(60),"<") |
| Enter - אנטר | (מעבר שורה) | vbCrlf | אין |
| בעת ההכנסה לDB אנטרים מתוך textarea אוטומטית הופכים לרווחים וכך לא ניתן לשמור על מעברי שורה. | לפני ההכנסה לDB נחליף את האנטרים בייצוגם הhtmlי כך שבשליפה הם יוצגו כאנטרים ולא כרווחים. replace(str,vbCrlf," ") |
הערות:
- בעמודת "הפיתרון" השתמשתי בהחלפה של הייצוג הVBSי בייצוג האסקי. באותה מידה יכולתי להשתמש בייצוג הויזואלי בתור מושא החלפה, ובייצוג הHTMLי בתור מחליף. מטעמי נוחיות אני תמיד משתמש בקומבינציה הזו מכיוון שהחלק המספרי במחרוזת הייצוג (VBS,Ascii) הוא זהה.
- השימוש באסקי ובתווי HTML שמורים הוא למען הנוחיות. באותה מידה יכולנו להחליף במחרוזת טקסט משלנו את הגרש ב"$geresh$" שהיא מחרוזת שסביר מאוד שלא תופיע כקלט – ואז, כאשר היינו שולפים מהDB היינו עושים עוד REPLACE, הפוך – אשר מחליף את מחרוזת הטקסט הנ"ל בגרש. שימוש באסקי או בתווי HTML שמורים חוסך מאיתנו את הREPLACE בעת השליפה מהDB.
- לאחר שנחליף את גדול מ (<) וקטן מ(>) ננטרל בעצם קוד HTML – שכן אסקי ותווי HTML שמורים לא נחשבים בעיני הדפדפן כחלקי תגיות HTML.
ועוד דוגמא...
דוגמא אחרונה ודי שתיישם את כל המקרים השכיחים:
בוא נאמר שאת הנתונים האלו אנו קולטים בדף a.asp בtextarea בשם "IAO" ושולחים בעזרת טופס לדף b.asp.
NBA's first time "win"
next line here…
בדף b.asp נעשה כך:
Str = request.form("IAO")
Str = replace(str,chr(34),""")
Str = replace(str,chr(39),"'")
Str = replace(str,chr(62),">")
Str = replace(str,chr(60),"<")
Str = replace (str, vbcrlf," ")
ונכניס לDB:
Conn.execute ("insert into tablename (the_str) values ('"&str&"')")
מחרוזת הטקסט שתשב עכשיו בפועל בDB היא:
<font color=red>NBA's first time "win" </font> next line here…
נראה מסובך? אכן. אבל כשתשלוףאכן. אבל כשנשלוף את זה לדף HTML זה יוצג בדיוק כמו בהתחלה, הדפדפן יתרגם את הייצוגים ששמנו לייצוג הויזואלי (בדיוק כמו בטבלה).
טיפ: כתבו לעצמכם פונקציה משלכם שתטפל בהכנסה לDB – ושתעשה את כל ההחלפות.
לטובתכם, אל תעתיקו את הדוגמאות מבלי להבין, נסו להבין לפני השימוש – ואם אתם לא מבינים אתם יכולים לשלוח לי אימייל shmil@arava.co.il או אפילו להתקשר אליי (!) 714819 - 053
תכנות מהנה!
|