PHP清理一串重复的逗号等

时间:2018-04-09 13:16:49

标签: php regex

我有一个问题 - 希望你能提供帮助。

我的用户将输入如下字符串:

'dt', 'time_hour', 'loc', 'protocol_category', 'service_identifier', 'mcc', 'imsi', 'service_dl_bytes', 'service_ul_ bytes'

根据其他输入,我会从此列表中删除两个字段(例如,service_identifier和service_dl_bytes)

这会在字符串中留下许多迷路逗号。

我需要一些逻辑说: - 只能有一个连续的逗号 - 不应该有逗号作为最后一个字符 - 逗号,空格逗号也是不允许的

基本上,格式必须是'input','input2','input3'

任何人都可以帮助我..我尝试使用以下内容,但它并不适用于所有用例

elseif ($df3aggrequired == "YES" and $df3agg2required == "NO" ) {
    #remove spaces from select statement
    $df3group0v2 = str_replace($df3aggfield, '', $df3select);
    #replace aggfield1 with null    
    $df3group1v2 = str_replace(' ', '', $df3group0v2);
    #replace instances of ,, with ,
    $df3group3v2 = preg_replace('/,,+/', ',', $df3group1v2);
    $finalstring0df3v2 = rtrim($df3group3v2, ',');
    $finalstring1df3v2 = str_replace('\'\'', '', $finalstring0df3v2);
    $finalstringdf3v2 = str_replace('.,', '', $finalstring1df3v2);
    $finalstringdf31v2 = str_replace(',,', ',', $finalstringdf3v2);
    $finalcleanup = preg_replace('/,,+/', ',', $finalstringdf31v2);
    echo"\\<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;.groupBy(";
    echo "$finalcleanup";
    echo ")";

5 个答案:

答案 0 :(得分:1)

我还认为字符串替换可能会导致问题,因此类似于geoidesic的过程,此代码试图坚持使用字段作为CSV列表,并删除引号作为解码的一部分,但也放他们又回来了。

$fields = "'dt', 'time_hour', 'loc', 'protocol_category', 'service_identifier', 'mcc', 'imsi', 'service_dl_bytes', 'service_ul_ bytes'";

$removeFields = true ;

$fieldList = str_getcsv($fields, ",", "'");
if ( $removeFields == true )    {
    if ( ($key = array_search('loc', $fieldList)) !== false )   {
        unset ( $fieldList[$key] );
    }

    $fields = "'".implode("', '", $fieldList)."'";
}

echo $fields;

该示例删除了&#39; loc&#39;字段,但可以修改此字段以删除所需的任何字段。

最终输出是(假设&#39; loc&#39;被删除)......

'dt', 'time_hour', 'protocol_category', 'service_identifier', 'mcc', 'imsi', 'service_dl_bytes', 'service_ul_ bytes'

答案 1 :(得分:0)

删除流程后,无论您的字符串是什么,您都可以使用positive lookahead在其上运行一个preg_replace

^\s*(,\s*)*|,\s*(?=,|$)

Live demo

故障:

  • ^\s*(,\s*)*在开头
  • 匹配不需要的逗号
  • |
  • ,\s*(?=,|$)匹配连续逗号或尾随的

PHP代码:

$string = preg_replace('~^\s*(,\s*)*|,\s*(?=,|$)~', '', $string);

您最好在删除字词时考虑删除不需要的逗号。

答案 2 :(得分:0)

如果是逗号分隔列表,则不要使用str_replace。首先将字符串分成逗号:

将字符串转换为数组
$myArray = explode(',' $myString);

然后删除你不想要的数组部分,并再次将其作为字符串:

$fieldsToDelete = ["service_identifier", "service_dl_bytes"];
$newArray = [];
foreach($myArray as $key => $value) {
   if(!in_array($value, $fieldsToDelete) {
      array_push($newArray, $value)  
   }
}
$newString = implode(',', $newArray)

答案 3 :(得分:0)

以下代码适用于您要删除的字段的index

与@geoidesic写的答案相同,但在字符串中使用字段索引而不是字符串匹配。

$user_input = "'dt', 'time_hour', 'loc', 'protocol_category', 'service_identifier', 'mcc', 'imsi', 'service_dl_bytes', 'service_ul_ bytes'";
$input_array = explode(',', $user_input);

// 4 = 'service_indentifier'
// 8 = 'service_ul_ bytes' 
$remove_input = array(4, 8);

foreach($remove_input as $array_index) {
    unset($input_array[$array_index]);
}

$parsed_input = implode(',', $input_array);

var_dump($parsed_input);

// Output: string(80) "'dt', 'time_hour', 'loc', 'protocol_category', 'mcc', 'imsi', 'service_dl_bytes'"

答案 4 :(得分:0)

您已尝试

$var = preg_replace(["/'[\s,]*,[\s,]*'/", "/^[\s,]*|[\s,]*$/"], ["', '", ""], $var);

它可以帮助!