Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
检查并替换字符串PHP中的双精度表达式_Php_Regex_Preg Replace - Fatal编程技术网

检查并替换字符串PHP中的双精度表达式

检查并替换字符串PHP中的双精度表达式,php,regex,preg-replace,Php,Regex,Preg Replace,这是我的字符串,例如: $x = " i love you/i love her/you love me/you love me " 我想在每个空白处都放上-所以我用: $y = preg_replace(" ","-",$x); 我得到: $y = " i-love-you/i-love-her/you-love-me/you-love-me " 在这个字符串中,我有两个表达式“你爱我”,在这种情况下,当我有这个表达式时,我想加上另一个,而不是一个-,我想加上2-- 因此,我的最终字

这是我的字符串,例如:

$x = " i love you/i love her/you love me/you love me "
我想在每个空白处都放上-所以我用:

$y = preg_replace(" ","-",$x);
我得到:

  $y = " i-love-you/i-love-her/you-love-me/you-love-me "
在这个字符串中,我有两个表达式“你爱我”,在这种情况下,当我有这个表达式时,我想加上另一个,而不是一个-,我想加上2--

因此,我的最终字符串将如下所示:

$y = " i-love-you/i-love-her/you-love-me/you--love--me "

你能帮我解决这些问题吗,因为如果我使用preg-replace,它会对整个字符串产生影响吗?

你可以通过两种方式来做,比如正则表达式非正则表达式方式,但这就是我想到的
数组计数值()
str\u-replace()
。希望它能帮助你:)


演示:

另一种更详细、可能更慢的方法:{

function format_string($x)  
{
    //trim whitespace to avoid "-" at beginning and end 
    $x = str_replace(" ","-",trim($x));
    // create an array of each entry 
    $entries = explode("/", $x);
    //count each entry 
    $entry_counts = array_count_values($entries);

    foreach($entry_counts as $string => $count){
        if($count == 2){
            $needs_updating = $string;  
        }
    }

    if(isset($needs_updating)){
        foreach($entries as $index => &$entry){
            if($entry == $needs_updating){
                $entries[$index] = str_replace("-", "--",$entry);
            }
        }

        return implode("/", $entries); 
     }

    return implode("/", $entries); 

}

从原始字符串开始,您可以匹配斜杠分隔的短语,并在跟踪短语的回调函数中进行空格替换。如果其中一个短语已经出现,请用双破折号替换空格,而不是单破折号

$pattern = '/(?<=^|\/).+?(?=\/|$)/';
$phrases = [];
$y = preg_replace_callback($pattern, function($phrase) use (&$phrases) {
    $separator = in_array($phrase[0], $phrases) ? '--' : '-';
    $phrases[] = $phrase[0];
    return str_replace(' ', $separator, $phrase[0]);
}, trim($x));
$pattern='/(?试试这个简单的代码

$x = "i love you/i love her/you love me/you love me";
$strArr = explode("/",$x);
$temp = array();
foreach($strArr as $value){
    if(in_array($value,$temp)){
       $result[]=str_replace(" ","--",$value);    
    }else{
       $result[]=str_replace(" ","-",$value);
    }
    $temp[] = $value;
}
echo implode("/",$result);
这是我的建议:

$x = " i love you/i love her/you love me/you love me ";

$x = preg_replace_callback('/([^\/]+)\/(\1)?/', function($match){
    if(isset($match[2])){
        return str_replace(' ', '-', trim($match[1])).'/'.str_replace(' ', '--', trim($match[2]));
    }else{
        return str_replace(' ', '-', trim($match[1])).'/';
    }
}, $x);

echo $x;
输出

i-love-you/i-love-her/you-love-me/you--love--me 
以及它的小型化版本:

$x = " i love you/i love her/you love me/you love me ";
echo preg_replace_callback('/([^\/]+)\/(\1)?/',function($m){return isset($m[2])?str_replace(' ','-',trim($m[1])).'/'.str_replace(' ','--',trim($m[2])):str_replace(' ','-',trim($m[1])).'/';},$x);

所以你想加一句——在最后一句中总是说‘我爱你/你爱我/我爱你/你爱她/你爱我/她爱我’,你觉得呢expect@AlivetoDie是的,不总是这样,只有当最后一个是前一个的重复时,你可以使用捕获组量词来寻找彼此相邻的重复项,然后再进行一些额外的重放基于捕获组2的整合此代码很棒,我想将其用于另一个类似的字符串:$x=“蜂窝和数据无线电|调制解调器|模拟调制解调器|模拟--调制解调器|模拟--调制解调器”在这种情况下,我有三重双精度表达式,要在代码中更改什么,只有最后一个表达式有--?在数组条件$tmp=array\u count\u value($temp)中添加下面的代码;如果($tmp[$value]>1)$result[]=str\u replace(“,”--“,$value);否则$result[]=str replace(“,”,“,”,$value);不,你不是很了解我,如果我有三个case,那么我只想添加两行——在最后一行中,前两行只有一行——就像这样:$x=“蜂窝和数据无线电|调制解调器|模拟调制解调器|模拟调制解调器|模拟调制解调器”在in_array()条件$key=array\u搜索($value,array\u reverse($temp,true)),如果(!empty($key))$result[$key]=str_replace(“,”-“,$value);$result[]=str_replace(“,”-“,$value);哥们,你真了不起!非常感谢!
i-love-you/i-love-her/you-love-me/you--love--me 
$x = " i love you/i love her/you love me/you love me ";
echo preg_replace_callback('/([^\/]+)\/(\1)?/',function($m){return isset($m[2])?str_replace(' ','-',trim($m[1])).'/'.str_replace(' ','--',trim($m[2])):str_replace(' ','-',trim($m[1])).'/';},$x);