搜索问题&使用substr_replace替换

时间:2014-05-21 17:33:36

标签: php string search replace

我尝试过很多方法,有些是部分工作,有些根本不工作。这一个根本不起作用,因为while条件由于某种原因一直返回false,它不会开始替换。 我基本上想要的是我放入一个字符串,然后我搜索一个单词并用另一个单词替换它。我设法做到这一点,唯一的问题是没有替换单词,如果它是从字符串的第0个位置开始,它仍然回显字符串中的第0个字母并继续使用新单词。例如。 :“老了”,我想用新的替换旧的,它会回应“onew is new”。 请告诉我,我是否应该做任何不同的事情,以便有一个更干净和完美优化的代码来加速网站。 谢谢。

<?php 
$offset = 0;
if (isset($_POST['user_input']) && !empty ($_POST['user_input'])) {
    $initial_string = $_POST['user_input'];
    $string_length = strlen($initial_string);
    $new_string = $initial_string;
    if (isset($_POST['search_input']) && !empty ($_POST['search_input'])) {
        $search_input = $_POST['search_input'];
        $search_input_length = strlen($search_input);
    } else {
        echo 'Please write the string that you want to replace into the Search input'.'<br>'.PHP_EOL;
    }
    if (isset($_POST['replace_input']) && !empty ($_POST['replace_input'])) {
        $replace_input = $_POST['replace_input'];
        $replace_input_length = strlen($replace_input);
    } else {
        echo 'Please write the string that you want to switch to into the Replace input'.'<br>'.PHP_EOL;
    }
    while (strpos($new_string,$search_input,$offset) === true) {
    $strpos = strpos($new_string,$search_input,$offset);
    if ($offset<$string_length) {
            $new_string = substr_replace($new_string,$replace_input,$strpos,$search_input_length);
            $offset = $offset + $replace_input_length;
        } else {
            break;
        }
    }
}

echo $new_string;

?>

<hr>

<form action="index.php" method="POST">
    <textarea name="user_input" rows="7" cols="30"></textarea><Br>
    Search: <input type="value" name="search_input"><br>
    Replace: <input type="value" name="replace_input"><br>
    <input type="submit" value="submit">

</form>

3 个答案:

答案 0 :(得分:1)

您的代码有很多问题。这些是需要注意的重要事项:

  • isset($var) && !empty($var)是多余的。 empty($var)还检查变量是否已设置,如果不是则返回true。只需!empty($var)即可。

  • 您正在检查strpos()是否返回布尔值truestrpos()永远不会返回true。它要么在大海捞针中返回针的位置,要么在大海捞针中找不到针时false

修复当前代码

更改while条件以检查strpos()是否返回非假值(匹配 时是这种情况):

while (strpos($new_string, $search_input, $offset) !== false)
{
    $strpos = strpos($new_string, $search_input, $offset);
    if ($offset < $string_length)
    {
        $new_string = substr_replace($new_string, $replace_input, $strpos, $search_input_length);
        $offset     = $offset + $replace_input_length;
    }
    else
    {
        break;
    }
}

这应该正确输出:

new is new

Working demo

更好的解决方案

您当前的代码似乎不必要地复杂化。基本上,您只是尝试将所有替换为字符串中子字符串的出现。这正是str_replace()的作用。请改用该功能。然后,您的代码可以简化为:

if (validation goes here) {
    $new_string = str_replace($search_input, $replace_input, $new_string);
}

答案 1 :(得分:0)

如果我理解你想用另一个子串替换给定子串(在一个更大的字符串内)的所有出现。

为此,您只需使用str_replace

即可

http://www.php.net/manual/en/function.str-replace.php

替换while循环
$new_string = str_replace( $search_input, $replace_input, $initial_string );

答案 2 :(得分:0)

我可能不会完全理解你想要做什么,但似乎有点过于复杂。为什么不在整个user_input上运行单个str_replace?

if (!empty($_POST['user_input'] && !empty ($_POST['search_input'] && !empty ($_POST['replace_input'])) {
    $str = str_replace($_POST['search_input'], $_POST['replace_input'], $_POST['user_input']);
    die(var_dump($str));
} else {
    die('error');
}