PHP中str_replace短语替换失效问题求助
Troubleshooting PHP Phrase Replacement Not Working
Let's break down why your phrase replacement isn't working and fix it step by step:
Core Issue: Case Mismatch
The biggest problem here is case sensitivity in str_replace(). You're converting the user's input to lowercase with strtolower($_POST["typed_phrase"]), but your replacement array $a contains phrases with uppercase first letters (like "A bird in the hand..."). Since str_replace() is case-sensitive, it can't find a match between the lowercase input and the mixed-case phrases in $a—so no replacement happens.
Additional Small Issues to Address
- Undefined variable notice:
$actualMeaningisn't initialized before it's echoed on page load, which will trigger a PHP warning. - Unconditional meaning output: The meaning section displays even when the form hasn't been submitted, leading to empty or broken output initially.
- Minor HTML fixes: Your doctype tag was malformed, and the
<html>tag lacked a language attribute.
Fixed Code
Here's the revised version with all issues resolved:
<?php define("TITLE", "Phrase Convertor" ); // Initialize variables to avoid undefined notices $actualMeaning = ""; $Typed = ""; if (isset($_POST["fix_submit"])) { // Get user input (keep original case to match array $a, or use str_ireplace for case-insensitive matching) $Typed = $_POST["typed_phrase"]; // Store array of phrases (case matches how users are likely to input them) $a = array( "A bird in the hand is worth two in the bush", "A bunch of fives", "A chain is only as strong as its weakest link", "A diamond in the rough", "A diamond is forever" ); $b = array( "It's better to have a lesser but certain advantage than the possibility of a greater one that may come to nothing.", "A fist—The fives refer to the five fingers.", "The proverb has a literal meaning, although the 'weakest link' referred to is figurative and usually applies to a person or technical feature rather than the link of an actual chain.", "Someone who is basically good-hearted but lacking social graces and respect for the law.", "Advertising slogan for De Beers' diamonds." ); // Option 1: Case-sensitive replace (matches exact phrase case) $actualMeaning = str_replace($a, $b, $Typed); // Option 2: Use str_ireplace if you want to ignore case entirely (e.g., match "a bird..." or "A BIRD...") // $actualMeaning = str_ireplace($a, $b, $Typed); } ?> <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title><?php echo TITLE; ?></title> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/css/bootstrap.min.css" integrity="sha384-Gn5384xqQ1aoWXA+058RXPxPg6fy4IWvTNh0E263XmFcJlSAwiGgFAW/dAiS6JXm" crossorigin="anonymous"> </head> <body> <div class="container"> <h1><?php echo TITLE; ?></h1> <p class="lead">Type your phrase to get its actual meaning</p> <div class="row"> <form class="col-sm-8" action="" method="post"> <textarea placeholder="Type your phrase" class="form-control input-lg" name="typed_phrase"><?php echo htmlspecialchars($Typed); ?></textarea><br> <button type="submit" class="btn btn-primary btn-lg float-right" name="fix_submit">Meaning!</button> </form> </div> <?php if(isset($_POST["fix_submit"])) { ?> <hr> <strong class='text-danger'>Your phrase</strong> <h4><?php echo ucwords($Typed); ?></h4> <strong class='text-success'>Meaning of phrase</strong> <h4><?php echo ucwords($actualMeaning); ?></h4> <?php } ?> </div> <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.0.0/js/bootstrap.min.js" integrity="sha384-JZR6Spejh4U02d8jOt6vLEHfe/JQGiRRSQQxSfFWpi1MquVdAyjUar5+76PVCmYl" crossorigin="anonymous"></script> </body> </html>
Key Changes Explained
- Case matching: Removed
strtolower()from the input (or usestr_ireplaceif you want to ignore case entirely) so the input matches the case of phrases in$aforstr_replaceto work. - Variable initialization: Added
$actualMeaning = "";and$Typed = "";to avoid PHP undefined variable warnings. - Conditional output: Wrapped the result display inside the
isset($_POST["fix_submit"])check, so it only shows after the form is submitted. - Input sanitization: Added
htmlspecialchars($Typed)to the textarea to prevent XSS vulnerabilities when repopulating the user's input. - HTML fixes: Corrected the doctype tag and added a language attribute to the
<html>tag for better standards compliance.
内容的提问来源于stack exchange,提问作者pankaj jha
相关产品推荐
相关产品推荐

