从最后开始查找和替换

时间:2012-10-06 20:12:49

标签: php regex replace

  

可能重复:
  Preg Replace - replace second occurance of a match

我有一个包含单词rules两次的字符串。我需要找到并替换第二个单词。试着和str_replace()一起玩弄但却得不到任何东西,第四个参数并不是我的预期。

以下是一个示例字符串:

http://localhost/proj1/modstart/admin/index.php?i=rules&sid=397ab1f6b8eb8a17787438a7e2e60ea3&mode=rules

我替换之后应该是这样的:

http://localhost/proj1/modstart/admin/index.php?i=rules&sid=397ab1f6b8eb8a17787438a7e2e60ea3&mode=manage

我读到preg_replace()可以提供帮助,但我不知道如何编写模式。

想法?

P.S:不建议将字符串拆分为两个不符合我需求的变量。

3 个答案:

答案 0 :(得分:0)

要不使用正则表达式,也不要将任何内容存储到第二个变量中,您可以使用str_replace()中的strpos()来使用$string = substr($string, 0, strpos($str, 'rules') + 5) . str_replace('rules', 'whatever', substr($string, strpos($string, 'rules') + 5));

rules

这将使完整的字符串到达​​$pos = strpos($string, 'rules') + 5; $string = substr($string, 0, $pos) . str_replace('rules', 'whatever', substr($string, $pos)); 的第一个实例的末尾,然后在字符串的第二部分上执行字符串替换,该字符串将包含该单词的任何其他实例。< / p>

同样的事情,但更清洁一点(是的,通过使用第二个变量):

$findMe = 'rules';
$replaceWith = 'whatever';
$pos = strpos($string, $findMe) + strlen($findMe);
$string = substr($string, 0, $pos) . str_replace($findMe, $replaceWith, substr($string, $pos));

如果要查找+替换的单词是动态的,或者您想在不同的页面上使用不同的单词,则可以 变量,如下所示:

{{1}}

答案 1 :(得分:0)

了解正则表达式是一个非常好的主意。在PHP中,您可以像这样完成查找/替换:

$result = preg_replace('/(rules.*?)rules/','$1manage',$str,1);

它基本上找到“规则”一次,然后是任何东西,然后再次规则,然后在第二次匹配之前将其全部放回并替换该单词。

答案 2 :(得分:0)

您应该使用正则表达式&gt;&gt;

$new = preg_replace('/\brules\b(?!.*\brules\b)/', 'manage', $old); 

使用单词边界\b是一个好主意,因此它不会匹配包含“规则”的更大字符串,例如“preudorules”

否定前瞻(?!.*\brules\b)确保后面没有其他单词“规则”,因此您要替换的是最后一个。