2

假设我得到了这个字符串:

$str = "alemylaife";

(我知道它拼写错误,我的一生)

现在我该如何更换

“ale”而不替换“ale”之后也包含相同字母的任何内容?

假设我得到了这个数组:

$replace = Array("a","l","e");  
$with = Array("wh","at","ever");

$str = str_replace($replace,$with,$str);
echo $str;

这将打印:

 whatevermyatwhifever 

如何停止 str_replace 以替换“ale”之后的字母?也许我必须修剪前 3 个字母然后替换它们然后加入修剪过的字符串?

编辑:我将尝试更清楚地表达自己。如果它们包含 A THEN L THEN 不管字母,我只想替换三 (3) 个首字母,所以,ala ale ald alr aly。这些是我想要替换的字母。我不希望他们之后的信件受到影响。

4

4 回答 4

2

问题不是很清楚。假设您想用“whatever”替换“ale”(如果我错了,请纠正我),那么您可以使用 preg_replace 来限制替换的数量。

示例 1:(替换第一次出现的“ale”)

preg_replace("/ale/", "whatever", "alemylaife", 1)
> whatevermylaife

示例 2:(仅当字符串以“ale”开头时替换)

preg_replace("/^ale/", "whatever", "alemylaife", 1)
> whatevermylaife

preg_replace("/^ale/", "whatever", "lolalemylaife", 1)
> lolalemylaife

编辑:您编辑了您的问题以提供更好的细节,我会使用:

// match a string that begins with "al" and then a character (case in-sensitive)
preg_replace("/^al[a-z]/i", "whatever", "alemylaife");
于 2012-12-27T10:56:26.607 回答
1

输出 F,因为 A 被 B 替换,然后 B 被 C 替换,依此类推......最后 E 被 F 替换,因为从左到右替换。

$search  = array('A', 'B', 'C', 'D', 'E');
$replace = array('B', 'C', 'D', 'E', 'F');
$subject = 'A';
echo str_replace($search, $replace, $subject);

输出:apearpearle pear 出于上述相同的原因

$letters = array('a', 'p');
$fruit   = array('apple', 'pear');
$text    = 'a p';
$output  = str_replace($letters, $fruit, $text);
echo $output;

并为进一步参考检查 http://php.net/manual/en/function.str-replace.php

于 2012-12-27T10:39:13.130 回答
1

我不太清楚您在这里寻找哪种字符串函数。

$string = "alemylaife";

然后你写信"ale"。目前尚不清楚您是指序列"ale"还是仅指字母、任何顺序、任何计数,直到其中每个 ( "a", "e", "l") 至少匹配一次。

那将是两件截然不同的事情。让我们采取第一个,它更容易:

// search for needle

$needle = 'ale';
$pos = strpos($string, $needle);

if (false === $pos) {
    $before = '';
    $after  = $string;
} else {
    $before = substr($string, 0, $pos);
    $after  = substr($string, $pos + strlen($needle));
}

然后,您可以在您想要的部分上运行替换,然后再连接。

第二种变体需要更多的处理逻辑。这可以通过找到每个字符的第一个位置来完成,然后最大匹配就是该位置。如果任何一个搜索失败,它就会失败。这将替换str_pos第一个示例中的调用,实际上它正在多次运行它:

// search for character group

$group = str_split($needle);

$pos = false;
foreach (str_split($needle) as $character) {
    $test = strpos($string, $character);
    if (false === $test) {
        $pos = false;
        break;
    }
    $test += strlen($character);
    if ($test >= $pos) {
        $pos = $test;
    }
}

最后,$pos包含第一个字母的位置,它是整个组的最后一个匹配字母。

于 2012-12-27T11:03:42.630 回答
0

你有固定的搜索和替换吗?机器无法知道ale您指的是哪个字符串。

您可以扩大搜索范围,直到找到唯一匹配项,例如,使用设置为 1 的限制参数替换alemall mpreg_replace。当然,这总是会替换第一次出现的。

于 2012-12-27T10:44:17.327 回答