【问题标题】:Replace entire input string using substr_replace?使用 substr_replace 替换整个输入字符串?
【发布时间】:2013-12-28 16:09:46
【问题描述】:

示例:已更新 - 更正了下面的代码)

<?php

$canonical = 'http://eg.com/in/sample-post/';

$pos = strpos( $canonical, 'in' );

echo substr_replace( $canonical, 'main', $pos, strlen('in') );

// OUTPUT: http://eg.com/mamain/sample-post/

?>

如示例中所示,我试图用main(替换)替换URL 中uk(主题)的第一个实例。相反,输出显示mamain。我不知道为什么。

但如果否,相同的代码似乎也可以工作。 主题中的字符数大于替换,例如

<?php

$canonical = 'http://eg.com/main/sample-post/';

$pos = strpos( $canonical, 'main' );

echo substr_replace( $canonical, 'uk', $pos, strlen('main') );

// OUTPUT: http://eg.com/uk/sample-post/

?>

很明显,第二个代码虽然相同,但符合我的意图。

如何修改代码以使其适用于两种情况?我在这里缺少什么逻辑?

注意:

  • 代码只是为了让您了解我在做什么。

  • 我想避免使用 preg_replace 来避免正则表达式的复杂性。

【问题讨论】:

  • 第一个例子对我来说很好,我得到了预期的输出http://eg.com/main/sample-post/。您确定您的原始代码中没有其他错误吗?
  • @BluePsyduck 你是对的。更正了代码。您现在应该能够重现该错误。
  • 不,我仍然得到相同的输出。但现在看起来您调用了保存此代码的函数两次,因此您将in 替换为main,然后(意外地)再次将main 中的in 替换为mamain。你能确保这段代码只在你的变量上执行一次吗?

标签: php string replace substr strpos


【解决方案1】:

你的例子对我来说很好。

但看起来您调用了保存此代码的函数两次,因此您将in 替换为main,然后(意外地)再次将main 中的in 替换为mamain

你能确保这段代码只在你的变量上执行一次吗?

【讨论】:

    【解决方案2】:

    您可以在这里使用preg_replace

    $canonical = 'http://eg.com/uk/sample-post/';
    echo preg_replace('/\buk\b/', 'main', $canonical) . "\n";
    
    $canonical = 'http://eg.com/main/sample-post/';
    echo preg_replace('/\bmain\b/', 'uk', $canonical) . "\n";
    

    输出:

    http://eg.com/main/sample-post/
    http://eg.com/uk/sample-post/
    

    【讨论】:

    • 我使用substr_replace 的原因是为了避免preg_replace 带来的正则表达式并发症。 :-/
    • 解决方案应该由需求驱动。您的要求是,一个简单的preg_replace 可以轻松解决它。
    • 我的问题中显示的代码只是我正在做的事情的一个示例(更具动态性)。但感谢您的时间。 :)
    【解决方案3】:

    这似乎对我有用:

    $string = 'http://eg.com/uk/sample-post/';
    
    echo substr_replace( $string, 'main', strpos($string,'uk'), strlen('uk'));
    

    你也可以使用:

    $string = 'http://eg.com/uk/sample-post/';
    
    echo str_replace('uk','main', $string);
    

    但这将替换所有出现...

    【讨论】:

    • Jason,在您发布答案之前,我已经编辑了我的问题。请查看我的问题中更新的代码(第一个代码块)。
    猜你喜欢
    • 2021-01-25
    • 1970-01-01
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多