检查并替换字符串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);