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

check and replace double expression in string PHP

这是我的字符串,例如:

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

我想在每个空白处 space 放置 - 所以我使用:

$y = preg_replace(" ","-",$x);

我得到:

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

在这个字符串中,我有双重表达 YOU LOVE ME,在那种情况下,当我有那个时,我想添加其他而不是 -,我想添加 2 --

所以我的最终字符串将如下所示:

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

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

您可以通过 regexnon-regex 两种方式来做到这一点,但这就是我想到的 array_count_values()str_replace()。希望对你有帮助:)

<?php
$x = " i love you/i love her/you love me/you love me ";
$sentence = explode('/',trim($x));

$value_counts = array_count_values($sentence);
$expected_result = [];
foreach($value_counts as $k=>$v){
    if($v<2){
        $expected_result[] = str_replace(' ','-',$k);
    }else{
        $expected_result[] = str_replace(' ','-',$k);
        for($i=2;$i<=$v;$i++){
            $expected_result[] = str_replace(' ','--',$k); 
        }
    }
}

echo " ".implode('/', $expected_result)." ";

输出:

 i-love-you/i-love-her/you-love-me/you--love--me 

演示: https://3v4l.org/Hh6Pj

另一种更冗长且可能更慢的方法:{

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); 

}

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

$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));

试试这个简单的代码

$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('/([^\/]+)\/()?/', 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('/([^\/]+)\/()?/',function($m){return isset($m[2])?str_replace(' ','-',trim($m[1])).'/'.str_replace(' ','--',trim($m[2])):str_replace(' ','-',trim($m[1])).'/';},$x);