100% Free Forever
AI-Powered Learning
Industry Expert Content
Certificates & Badges
Learn At Your Own Pace
PHP

String Functions and Formatting

Master PHP's core string manipulation and formatting functions, from searching and slicing to sprintf-style output and multibyte-safe operations.

Arrays & StringsBeginner9 min readJul 9, 2026
Analogies

String Functions and Formatting

Strings are one of PHP's most heavily used types, and the language provides a large, sometimes inconsistently named, standard library for working with them — functions like strlen, substr, str_replace, and strpos cover the majority of everyday text processing. PHP strings are byte sequences by default, which matters for multibyte character sets like UTF-8; functions such as mb_strlen() and mb_substr() from the mbstring extension operate correctly on multibyte text where their byte-oriented counterparts would miscount or corrupt characters.

🏏

Cricket analogy: PHP's core string toolkit (strlen, substr, str_replace, strpos) is like the everyday tools a scorer uses for routine scoring, but just as counting a name written in Devanagari script by byte breaks down, PHP's byte-oriented functions miscount multibyte UTF-8 text, so mb_strlen() and mb_substr() are the character-aware tools needed for accurate international scorecards.

Searching, Slicing, and Replacing

strpos() finds the position of a substring (returning false, not -1, when not found — a common source of bugs when the result is used in a loose boolean check), while substr() extracts a portion of a string given a start offset and optional length, both of which accept negative values to count from the end. str_replace() performs simple substring replacement and accepts arrays for searching/replacing multiple values in one call, while str_contains(), str_starts_with(), and str_ends_with() (added in PHP 8.0) provide clear, purpose-built boolean checks that avoid the classic strpos() !== false idiom.

🏏

Cricket analogy: strpos() returning false (not -1) when a shot type isn't found in commentary text is a classic trap if checked loosely, like assuming 'no boundary found' means 'position zero'; substr() can count from the end like reading the last 6 balls of an over; str_contains(), str_starts_with(), and str_ends_with() (PHP 8) are the modern way to ask 'did this over start with a wide?' instead of the old strpos() !== false check.

php
$sentence = 'PHP powers a large share of the web.';

if (str_contains($sentence, 'PHP')) {
    echo 'Found PHP mention.';
}

$excerpt = substr($sentence, 0, 3);      // 'PHP'
$tail    = substr($sentence, -4);        // 'web.'

$clean = str_replace(['large', 'web'], ['huge', 'internet'], $sentence);

Formatting Output with sprintf and number_format

sprintf() (and its echo-directly cousin printf()) formats values into a template string using conversion specifiers like %s (string), %d (integer), %.2f (float with fixed decimals), and %05d (zero-padded width), giving precise control over layout that string concatenation cannot match cleanly. number_format() is the go-to function for human-readable numeric display, handling thousands separators and decimal precision in one call, which is especially useful for currency and statistics.

🏏

Cricket analogy: sprintf() formatting a score template like '%s scored %d runs off %d balls' with precise placeholders is like a scoreboard operator slotting exact numbers into fixed display fields; %05d zero-pads a jersey number to always show 5 digits, and number_format() turning a season's total runs into '10,000' with a comma is exactly how career-run milestones are announced.

php
$name = 'Ada';
$score = 97.456;

echo sprintf('%s scored %.1f%%', $name, $score); // Ada scored 97.5%
echo sprintf('Order #%05d', 42);                  // Order #00042

echo number_format(1234567.891, 2); // 1,234,567.89

Because PHP's classic string functions operate byte-by-byte, applying strlen() or substr() to a UTF-8 string containing multibyte characters (accented letters, emoji, CJK text) can return incorrect lengths or split a character in the middle, corrupting it. The mbstring extension provides mb_strlen(), mb_substr(), mb_strtoupper(), and similar functions that are character-aware rather than byte-aware, and should be preferred whenever text may contain non-ASCII input, such as user-submitted names or localized content.

🏏

Cricket analogy: Applying strlen() to a player name like 'Kohli 🏏' byte-by-byte can miscount because the emoji spans multiple bytes, like a scorer miscounting a name with a diacritic if reading it letter-by-letter incorrectly; mb_strlen() and mb_strtoupper() read each character correctly, essential when scorecards include international players' names.

A good rule of thumb: if a string could ever contain user-generated or internationalized text, reach for the mb_* function family. Reserve the plain string functions for known-ASCII data such as internal identifiers, hex strings, or fixed-format codes.

strpos() returns integer 0 when a match is found at the very start of a string, and PHP's loose truthiness treats 0 as falsy. Code like if (strpos($haystack, $needle)) silently fails to detect a match at position 0 — always compare explicitly with !== false, or use str_contains() in PHP 8+.

  • strpos() returns the numeric position or false; always check with !== false or use str_contains() to avoid the position-0 pitfall.
  • substr() and strpos() accept negative offsets to work from the end of a string.
  • sprintf()/printf() give precise formatted output using conversion specifiers like %s, %d, and %.2f.
  • number_format() handles thousands separators and decimal rounding for human-readable numeric display.
  • str_contains(), str_starts_with(), and str_ends_with() (PHP 8.0+) replace error-prone strpos() boolean checks.
  • mb_* functions are character-aware and required for correct handling of multibyte UTF-8 text.

Practice what you learned

Was this page helpful?

Topics covered

#PHP#PHPProgrammingStudyNotes#Programming#StringFunctionsAndFormatting#String#Functions#Formatting#Searching#StudyNotes#SkillVeris