【问题标题】:Trying to replace parts of string start with same search chars尝试替换部分字符串以相同的搜索字符开头
【发布时间】:2023-03-03 02:37:01
【问题描述】:

我正在尝试替换部分字符串。但是当我的搜索字符串以相同的字符开头时遇到了问题:

$string = "Good one :y. Keep going :y2"; 

$str = str_replace(array_keys($my_array), array_values($my_array), $string);   
$my_array= array(":y" => "a", ":y2" => "b");

输出:

Good one a. Keep going a2

我需要我的str_replace() 来正确/准确地匹配单词。

【问题讨论】:

    标签: php regex str-replace


    【解决方案1】:

    除了你应该在使用它之前先定义你的数组,这应该对你有用:

    $str = strtr($string, $my_array);
    

    您的问题是str_replace() 遍历整个字符串并替换它可以替换的所有内容,您也可以在手册中看到这一点。

    还有一段话:

    因为 str_replace() 替换 从左到右,它在进行多次替换时可能会替换以前插入的值。另请参阅本文档中的示例。

    为此,我在这里使用了strtr(),因为它首先尝试匹配搜索中的最长字节。

    您也可以在手册中阅读此内容并从中引用:

    如果给定两个参数,第二个应该是数组形式的数组('from' => 'to', ...)。返回值是一个字符串,其中所有出现的数组键都已替换为相应的值。 将首先尝试最长的键。一旦子字符串被替换,它的新值将不会被再次搜索。

    【讨论】:

    • 谢谢你救了我的命 :)
    • @НиколаВелев 不客气! (顺便说一句:您可以接受对您的帮助最大并解决了您的问题的答案!(meta.stackexchange.com/q/5234)如果您在那里有这样的答案,您也可以对所有其他问题执行此操作)
    • 谢谢伙计,我会做的:)
    【解决方案2】:
    :y\b
    

    仅使用此替换 :y 而不是 :y2。参见演示。

    https://regex101.com/r/sJ9gM7/9

    $re = "":y\\b"m";
    $str = "Good one :y. Keep going :y2\n";
    $subst = "a";
    
    
    $result = preg_replace($re, $subst, $str);
    

    :y2 也同样使用:y2\b

    【讨论】:

      【解决方案3】:

      尝试先替换:y2,然后再替换:y

      $string = "Good one :y. Keep going :y2"; 
      
      $my_array= array(":y2" => "b", ":y" => "a");
      
      $str = str_replace(array_keys($my_array), array_values($my_array), $string);
      

      输出

      Good one a. Keep going b
      

      Try it

      【讨论】:

      • 你的想法是对的,但你使用了错误的函数:) 这里你几乎实现了strtr(),但你不能完全用str_replace()来实现。在这里,您还从最长的字节替换开始,但您仍将替换以前的替换,而 strtr() 不会这样做。 (例如,如果您将::y2 替换为 :y,您最终将得到 a a,但使用 strtr(),您将得到 a :y
      • 是的,我不知道那个函数,我总是用 str_replace 来做这个 knida 工作。很高兴学到了新东西
      猜你喜欢
      • 2017-03-15
      • 1970-01-01
      • 2018-05-13
      • 2016-01-19
      • 1970-01-01
      • 1970-01-01
      • 2015-05-02
      • 2012-07-04
      • 2016-12-08
      相关资源
      最近更新 更多