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.
$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.
$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.89Multibyte and Case-Related Functions
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!== falseor usestr_contains()to avoid the position-0 pitfall.substr()andstrpos()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(), andstr_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
1. Why is `if (strpos($haystack, $needle)) { ... }` considered buggy?
2. Which function should be used to correctly get the character count of a UTF-8 string containing accented characters?
3. What does the sprintf format specifier %05d do?
4. Which PHP 8.0+ function most directly replaces the common `strpos($s, $needle) !== false` idiom?
5. What does number_format(1234567.891, 2) return?
Was this page helpful?
You May Also Like
Regular Expressions in PHP
Learn PCRE-based pattern matching in PHP with preg_match, preg_replace, and preg_match_all for validating, extracting, and transforming text.
Array Functions
Survey PHP's extensive standard-library array functions for transforming, filtering, searching, and reducing arrays without manual loops.
Working with JSON in PHP
Learn how to encode PHP data to JSON and decode JSON back into PHP values using json_encode and json_decode, plus common pitfalls and error handling.
Indexed and Associative Arrays
Understand PHP's single array type used for both ordered lists and key-value maps, including creation, iteration, and common manipulation patterns.
Related Reading
Related Study Notes in Programming
Browse all study notesApache Spark Study Notes
Programming · 30 topics
ProgrammingApache Flink Study Notes
Programming · 30 topics
ProgrammingHadoop Study Notes
Programming · 30 topics
ProgrammingSnowflake Study Notes
Programming · 30 topics
ProgrammingApache Airflow Study Notes
Programming · 30 topics
Programmingdbt (Data Build Tool) Study Notes
Programming · 30 topics