проверить и заменить двойное выражение в строке PHP - PullRequest
0 голосов
/ 23 октября 2018

Это моя строка, например:

$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, это будет влиять на всю строку?

Ответы [ 5 ]

0 голосов
/ 23 октября 2018

Вот мой ход:

$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);
0 голосов
/ 23 октября 2018

Попробуйте этот простой код

$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);
0 голосов
/ 23 октября 2018

Еще один более многословный и, вероятно, более медленный метод: {

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

}
0 голосов
/ 23 октября 2018

Начиная с исходной строки, вы можете сопоставлять фразы, разделенные косой чертой, и выполнять замену пробела в функции обратного вызова, которая отслеживает фразы по мере их поступления.Если одна из фраз уже появилась, замените пробелы двойными черточками вместо одиночных.

$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));
0 голосов
/ 23 октября 2018

Вы можете сделать это обоими способами, такими как regex или non-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 

DEMO: https://3v4l.org/Hh6Pj

...