Forum und email

מחרוזות

string היא רצף של תווים. בPHP, תו זהה לבית, לכן קיימים בדיוק 256 אפשרויות שונות לתווים. זה גם יותר ממרמז שלPHP אין תמיכה טבעית UNICODE. ראה את הפונקציות utf8_encode() ו utf8_decode() לתמיכה נוספת ב UNICODE.

Note: אין כל מגבלה עקרונים לגבי האורך של מחרוזות, ועל כן נושא מגבלת האורך לא צריך להטריד אתכם.

תחביר

מחרוזת יכולה להכתב בשלושה אופנים שונים:

גרש

הדרך הפשוטה ביותר לציין מחרוזת, היא לעטוף אותה בגרש משני קצותיה (התו ').

על מנת לציין גרש בתוך המחרוזת, תאלץ "להבריח" אותו ע"י שימוש בתו לוכסן אחורי (\), כמו בהרבה שפות אחרות. אם יש צורך בלוכסן אחורי, עצמו, צמוד לגרש, באמצע המחרוזת, או בתור התו האחרון במחרוזת, צריך להכפיל את הלוכסן האחורי. שים לב שבנסיון ל"הבריח" תוים אחרים הלוכסן האחורי יודפס בעצמו! , לכן בד"כ אין צורך ל"הבריח" את הלוכסן האחורי עצמו.

Note: ב PHP 3, תופיע אזהרה ברמת הE_NOTICE כשקורה כזה דבר.

Note: בניגוד לשני התחבירים האחרים , משתנים ורצפים של "הברחות" לא נפתחים במחרוזת עטופה בגרש יחיד.

<?php
echo 'this is a simple string';

echo 
'You can also have embedded newlines in 
strings this way as it is
okay to do'
;

// Outputs: Arnold once said: "I'll be back"
echo 'Arnold once said: "I\'ll be back"';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\\*.*?';

// Outputs: You deleted C:\*.*?
echo 'You deleted C:\*.*?';

// Outputs: This will not expand: \n a newline
echo 'This will not expand: \n a newline';

// Outputs: Variables do not $expand $either
echo 'Variables do not $expand $either';
?>

מרכאות כפולות

אם מחרוזת עטופה במרכאות כפולות ("), PHP מבינה יותר רצפים "מוברחים" לתוים מיוחדים:

תוים "מוברחים"
רצף משמעות
\n הזנת שורה - linefeed (LF or 0x0A (10) in ASCII)
\r החזרת הסמן לתחילת השורה - carriage return (CR or 0x0D (13) in ASCII)
\t טאב אופקי - horizontal tab (HT or 0x09 (9) in ASCII)
\\ לוכסן אחורי - backslash
\$ סימן דולר
\" מרכאות כפולות - double-quote
\[0-7]{1,3} רצפים של תוים שמתאימים ל - regular expression הם תוים בבסיס אוקטלי - בסיס 8
\x[0-9A-Fa-f]{1,2} רצפים של תוים שמתאימים ל - regular expression הם תוים בבסיס הקסדיצמאלי - בסיס 12

שוב , בנסיון "להבריח" כל תו אחר , הלוכסן האחורי יופיע גם הוא!

אבל התכונה החשובה ביותר של מחרוזת במרכאות כפולות היא , שמשתנים מפוענחים. ראה ניתוח מחרוזת לפרטים.

Heredoc

שיטה אחרת לתחום מחרוזת היא ,בעזרת תחביר מסוג heredoc ("<<<"). אחרי רצף התוים <<<,צריך לתת מזהה, את המחרוזת, ולאחריה שוב את המזהה.

המזהה הסוגרחייב להתחיל בעמודה הראשונה של השורה. כמו כן הוא חייב לעמוד בכל כללי נתינת השמות של PHP: רק תוים אלפאנומריים וקו תחתון, ולהתחיל בתו שאינו סיפרה או קו תחתון.

Warning

חשוב מאוד לשים לב שבשורה של המזהה הסוגר לא יהיה שום תו חוץ מ נקודה פסיק (;) אפשרי. בעיקר הכוונה היא ,שאסור להזיח את המזהה , ואסור שיהיה שום טאב או רווח לפני הנקודה פסיק. חשוב גם לציין שהתו שנמצא לפני התו המזהה, חייב להיות שורה חדה לפי הגדרות מערכת ההפעלה. שזה לדוגמא\rבמקינטוש

אם הכלל הזה נשבר, התו המזהה אינו "נקי", אזי הוא לא נחשב כתו מזהה, ו PHP ממשיכה לחפש אחד ,מה שיוביל כנראה לטעות קימפול, כשהטעות תירשם כאילו היא נמצאת, בשורה האחרונה של הסקריפט.

מחרוזת שמוגדרת ב Heredoc מתנהגת כמו מחרוזת שמוגדרת בעזרת גרשיים, חוץ מהגרשיים, כלומר אין צורך ל"הבריח" את התו גרשים בעזרת לוכסן אחורי.אבל ניתן להתשמש בכל התוים המיוחדים שרשומים למעלה , גם משתנים מפוענחים כמו במחרוזות.

Example#1 דוגמא לשימוש ב Heredoc

<?php
$str 
= <<<EOD
Example of string
spanning multiple lines
using heredoc syntax.
EOD;

/* More complex example, with variables. */
class foo
{
    var 
$foo;
    var 
$bar;

    function 
foo()
    {
        
$this->foo 'Foo';
        
$this->bar = array('Bar1''Bar2''Bar3');
    }
}

$foo = new foo();
$name 'MyName';

echo <<<EOT
My name is "$name". I am printing some $foo->foo.
Now, I am printing some 
{$foo->bar[1]}.
This should print a capital 'A': \x41
EOT;
?>

Note: התמיכה ב Heredoc התחילה החל מ PHP 4.

ניתוח משתנים

כאשר מחרוזת מוגדרת ע"י מרכאות או ע"י heredoc, משתנים מנותחים בתוכה.

יש שני סוגי תחביר, פשוטומסובך הפשוט יותר הוא נפוץ יותר ויותר נח לשימוש. הוא מספק דרך לניתוח משתנים, ערך של array או תכונה של object .

התחביר היותר מסובך הוצג לראשונה ב PHP 4, ומזוהה ע"י הסוגריים המסולסלים שמקיפים את הביטוי.

תחביר פשוט

בהיתקלות בסימן הדולר ($) , המפענח ינסה להתיחס למילה אחריו, בתור משתנה, ע"י סוגריים מסולסלים תוכל להבהיר בדיוק את שם המשתנה.

<?php
$beer 
'Heineken';
echo 
"$beer's taste is great"// works, "'" is an invalid character for varnames
echo "He drank some $beers";   // won't work, 's' is a valid character for varnames
echo "He drank some ${beer}s"// works
echo "He drank some {$beer}s"// works
?>

בצורה דומה אתה יכול לפנות לאינדקס של array או לשיטה של object . במערך הסוגרים המרובעים (]) מציינים את הסוף של האינדקס,. שיטות של עצמים, מטופלות כמו משתנים בסיסים, למרות שלא עובד אצלהם הטריק כמו במשתנים רגילים.

<?php
// These examples are specific to using arrays inside of strings.
// When outside of a string, always quote your array string keys 
// and do not use {braces} when outside of strings either.

// Let's show all errors
error_reporting(E_ALL);

$fruits = array('strawberry' => 'red''banana' => 'yellow');

// Works but note that this works differently outside string-quotes
echo "A banana is $fruits[banana].";

// Works
echo "A banana is {$fruits['banana']}.";

// Works but PHP looks for a constant named banana first
// as described below.
echo "A banana is {$fruits[banana]}.";

// Won't work, use braces.  This results in a parse error.
echo "A banana is $fruits['banana'].";

// Works
echo "A banana is " $fruits['banana'] . ".";

// Works
echo "This square is $square->width meters broad.";

// Won't work. For a solution, see the complex syntax.
echo "This square is $square->width00 centimeters broad.";
?>

לכל דבר יותר מסובך יש להתשמש בדקדוק המסובך.

תחביר מסובך (מסולסל).

התסביך נקרא מסובך, לא בגלל שהוא מסובך, אלא בגלל שאפשר להכליל בעזרתו ביטויים מסובכים.

למעשה אתה יכול להכליל כל ערך שקיים במרחב השמות, בתוך המחרוזת בעזרת התחביר הזה. אתה פשוט כותב את הביטוי כמו מחוץ למחרוזת, וז כותב מסביבו סוגרים מסולסלים { ו }. מאחר שאתה לא יכול "להבריח" את הסימן '{', התחביר יעבוד רק כאשר סימן הדולר $ בא מיד אחרי סימן הסוגריים {. (השתמש ב "{\$" או "\{$" על מנת לכתוב את הסימן "{$"). כמה דוגמאות להבהרה:

<?php
// Let's show all errors
error_reporting(E_ALL);

$great 'fantastic';

// Won't work, outputs: This is { fantastic}
echo "This is { $great}";

// Works, outputs: This is fantastic
echo "This is {$great}";
echo 
"This is ${great}";

// Works
echo "This square is {$square->width}00 centimeters broad."

// Works
echo "This works: {$arr[4][3]}";

// This is wrong for the same reason as $foo[bar] is wrong 
// outside a string.  In otherwords, it will still work but
// because PHP first looks for a constant named foo, it will
// throw an error of level E_NOTICE (undefined constant).
echo "This is wrong: {$arr[foo][3]}"

// Works.  When using multi-dimensional arrays, always use
// braces around arrays when inside of strings
echo "This works: {$arr['foo'][3]}";

// Works.
echo "This works: " $arr['foo'][3];

echo 
"You can even write {$obj->values[3]->name}";

echo 
"This is the value of the var named $name: {${$name}}";
?>

גישה לתוים במחרוזת.

ניתן לגשת לתו מסוים במחרוזת, ע"י פניה למיקום מסוים במחרוזת,בתוך סוגרים מסולסלים.

Note: בשביל תאימות לאחור, אפשר לעשות את זה גם בצורה של פניה למערכים (סוגריים מרובעים), אבל החל מ PHP 4 , הגישה הזאת נחשבת ללא תיקנית.

Example#2 כמה דוגמאות:

<?php
// Get the first character of a string
$str 'This is a test.';
$first $str{0};

// Get the third character of a string
$third $str{2};

// Get the last character of a string.
$str 'This is still a test.';
$last $str{strlen($str)-1}; 
?>

פונקציות יעילות ואופרטורים יעילים.

ניתן לשרשר מחרוזות ע"י שימוש באופרטור '.' (נקודה) . שים לב שהאופרטור '+' (חיבור) לא עובד על מחרוזות. ראה גם אופרטורים על מחרוזות לפרטים נוספים.

יש המון פונקציות יעילות, לטיפול במחרוזות.

ראה את מדריך לפונקציות על מחרוזות לפונקציות כלליות, פונקציות מסוג regular expression בשביל חיפוש &החלפה (משני סוגים : Perl ו POSIX extended).

יש גםפונצקיות למחרוזות URL, ופונקציות לקידוד ופיענוח של מחרוזות (mcryptוmhash).

לבסוף , אם עוד לא מצאת מה שחיפשת , ראה גם פונקציות על תוים.

המרת משתנה למחרוזת.

אתה יכול להמיר ערך למחרוזת , ע"י שימוש ב(string) , או בפונקציה strval() . המרה למחרוזת מתבצעת אוטומטית, בטווח של הביטוי כשנדרשת מחרוזת , למשל עקב שימוש בפונקציותecho()אוprint() , או בהשוואה של ערך כלשהו למחרוזת. קרא את המדריך על טיפוסיםומעבר בין טיפוסים על מנת להבהיר את הדברים ראה גם settype().

הערך הboolean אמת, מומר במחרוזת לביטוי"1" ,שקר לעומת זה מיוצג ע"י מחרוזת ריקה"" . כך שאפשר לעשות המרות דו כיוניות, בין מחרוזות לערכים בוליאניים.

שלמים וערכים בעלי נקודה עשרונית, מומרים למחרוזת שמייצגת את המספר, בספרות (כולל החזקה במספרים בעלי נקודה עשרונית).

מערך תמיד יומר למחרוזת "Array", כך שאינך יכול להציג למסך, ערכים של מערכים, בעזרת הפונקציות echo() או print()על מנת להציג אותם תאלץ לעשות משהו בסגנון של echo $arr['foo']. ראה למטה ,טיפים,איך לראות את כל תכולת המערך.

עצמים תמיד יומרו למחרוזת "Object". , על מנת להדפיס משתנה שנמצא בעצם כלשהו, ראה את ההסברים למטה. על מנת לדעת לאיזה מחלקה שייך העצם, השתמש בפונקציות, use get_class().

משאבים תמיד מומרים למחרוזת עם המבנה "Resource id #1" כש 1 הוא המספר היחודי של המשאב -resource שניתן לו ע"י PHP במהלך הריצה. ע"מ לקבל את הסוג של המשאב, השתמש בפונקציה get_resource_type().

NULL תמיד מומר למחרוזת ריקה.

כמו שאפשר היה לראות למעלה, הדפסה של מערכים, עצמים ומשאבים לא נותנת הרבה מידע, על תוכנם. שימוש בפונקציות print_r()ו var_dump() מאפשר לראות את הערכים, בעיקר בשביל ניפוי באגים.

אפשר גם להמיר ערכים ב PHP למחרוזות לצורך שמירתם באופן תמידי. השיטה הזאת נקראת serialization, ונעשית ע"י שימוש בפונקציה serialize(). אפשר גם לעשות serialization למבנים של XML , אם יש לך תמיכה מסוג WDDX בהגדרות ה PHP .

דו-שיח בין מחרוזות ומספרים

המרת מחרוזת למספר מתבצעת בשלבים הבאים.

המחרוזת תומר למספר בעל נקודה צפה, float אם היא מכילה את התוים '.', 'e', או 'E'. אחרת היא תומר למספר שלם.

הערך שיתקבל יהיה לפי החלק הראשון של המחרוזת, אם המחרוזת מתחילה במספר ולידי, הוא יהיה הערך שיתקבל, אחרת הערך יהיה 0 (אפס). מספר ולידי הוא , סימן אופציונלי(פלוס\מינוס) , כשאחריו סיפרה אחת או יותר (כולל נקודה עשרונית אופציונלית), כשאחרי זה סימן חזקה אופציונאלי. החזקה היא התו 'e' או 'E' כשאחריו סיפרה אחת או יותר.

<?php
$foo 
"10.5";                // $foo is float (11.5)
$foo "-1.3e3";              // $foo is float (-1299)
$foo "bob-1.3e3";           // $foo is integer (1)
$foo "bob3";                // $foo is integer (1)
$foo "10 Small Pigs";       // $foo is integer (11)
$foo "10.2 Little Piggies"// $foo is float (14.2)
$foo "10.0 pigs " 1;          // $foo is float (11)
$foo "10.0 pigs " 1.0;        // $foo is float (11)     
?>

בשביל מידע נוסף, קרא במדריך של יוניקס על strtod - 3.

אם תרצה לבחון את התוצאות של הדוגמאות למעלה, אתה יכול להתשמש ב"העתק/הדבק" , ולראות בעצמך מה יקרה:

<?php
echo "\$foo==$foo; type is " gettype ($foo) . "<br />\n";
?>

אל תצפה לקבל את הקוד של תו מסוים, ע"י המרתו למספר (כמו שקורה בשפת C למשל), השתמש בפונקציות ord() ו chr() בשביל זה.