用于替换字符的递归PHP函数

时间:2011-05-28 00:03:56

标签: php string function recursion replace

嘿,我正在尝试开发一个递归函数,我可以用来去除一串多个值的实例。

这是我到目前为止所做的:

$words = 'one__two_"__three';

$words = stripall(array('__', '"'), '_', $words);

echo $words;

function stripall($values, $replace, $string) {

    foreach ($values as $value) {

        if (strpos($string, $value)) {

            $string = str_replace($value, $replace, $string);

            stripall($values, $replace, $string);
        }
    }

    return $string;
}

这里$ words字符串被剥离了两个下划线(__)或引号(“)的所有实例。或者至少在理论上......

目标返回值为:

one_two_three

然而,我得到的是“one_two ___ three”

有人可以帮忙吗?

5 个答案:

答案 0 :(得分:1)

我对你的预期输出感到困惑:

one_two_three

假设你的字符串:

$words = 'one__two_"__three';

你的规则:

  

这里$ words字符串正在获取   剥夺了所有两个实例   下划线(__)或引号(“)

我们会像这样删除字符串:

$words = 'one[__]two_["][__]three';

所以你的预期输出应该是:

onetwo_three

使用str_replace的数组形式:

$words = 'one__two_"__three';
echo str_replace(array('"', "__"), "", $words) . "\n";

我得到了那个输出:

$ php test.php
onetwo_three

答案 1 :(得分:0)

你想试试我的吗?

//Example:
/*
    $data = strReplaceArrayRecursive(
        array('{name}'=>'Peter','{profileImg}'=>'./PRF-AAD036-51dc30ddc4.jpg'),
        array(
            'title'=>'My name is {name}',
            'post'=>array(
                'author' => '{name}',
                'image' => '{profileImg}',
                'content' => 'My post.'
            )
        )
    );
    print_r($data);
//Expect:
Array
(
    [title] => My name is Peter
    [post] => Array
        (
            [author] => Peter
            [image] => ./PRF-AAD036-51dc30ddc4.jpg
            [content] => My post.
        )

)
*/
function strReplaceArrayRecursive($replacement=array(),$strArray=false,$isReplaceKey=false){
    if (!is_array($strArray)) {
        return str_replace(array_keys($replacement), array_values($replacement), $strArray);
    }
    else {
        $newArr = array();
        foreach ($strArray as $key=>$value) {
            $replacedKey = $key;
            if ($isReplaceKey) {
                $replacedKey = str_replace(array_keys($replacement), array_values($replacement), $key);
            }
            $newArr[$replacedKey] = strReplaceArrayRecursive($replacement, $value, $isReplaceKey);
        }
        return $newArr;
    }
}

答案 2 :(得分:0)

$words = 'one__two_"__three';
$words = stripall(array('"','__'), '_', $words);
echo $words;
function stripall($values, $replace, $string) {
    foreach ($values as $value) {
        while (strpos($string, $value)) {
            $string = str_replace($value, $replace, $string);
            stripall($values, $replace, $string);
        }
    }
    return $string;
}

将IF更改为While并首先删除"然后检查__

答案 3 :(得分:0)

我认为没有人会说服我为此使用循环或非正则表达式方法。如果有人不使用正则表达式,我会以为他们只是不了解在不同的字符序列上执行替换的功能和用途。

该模式仅扫过输入字符串,并替换一个或多个下划线和/或双引号的所有序列。

此技术唯一不必要的副作用(但不会对结果产生负面影响)是它将不必要地用单个下划线替换单个下划线。理想情况下,模式不应设计为进行不必要的匹配/替换,但在这种情况下,它无需进行第二次扫描字符串以清除所有新生成的连续下划线的要求。

这只需一个函数调用就可以使您的文本整整齐齐-这正是正则表达式存在的原因。

代码:(Demo

$strings = [
    'one"two_"_"_three',
    'one__two_"__three',
    'one__two_"__""____"three',
    'one__two___"""""""______three',
];

var_export(
    preg_replace('~["_]+~', '_', $strings)
);

输出:

array (
  0 => 'one_two_three',
  1 => 'one_two_three',
  2 => 'one_two_three',
  3 => 'one_two_three',
)

答案 4 :(得分:-2)

这个功能完全没必要。 str_replace已经做了同样的事情。