清理和标准化包含不确定的分隔字符和空格序列的字符串

问题描述 投票:0回答:5

我有一个 php 变量,它来自需要整理的表单。

该变量包含一个项目列表(可能是两个或三个单词项目,单词之间有空格)。

我想将其转换为逗号分隔的列表,没有多余的空格。我希望分隔符只出现在逗号、分号或换行符处。空白不能成为项目。

这是一个综合示例(故意输入混乱的内容):

输入字符串:

$input = 'dog, cat         ,car,tea pot,,  ,,, ;;
fly,     cake';

期望的结果字符串:

dog,cat,car,tea pot,fly,cake
php regex string sanitization delimited
5个回答
9
投票

您可以首先将字符串拆分为“有用”的部分,然后使用preg_split

,然后implode
将这些部分重新组合在一起

$str_in = "dog, cat ,car,tea pot,, ,,, ;; fly, cake"; $parts = preg_split('/[,;\s]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); $str_out = implode(',', $parts); var_dump($parts, $str_out);

(这里,正则表达式将按“,

”、“
;
”和“
\s
”进行拆分,这意味着任何空白字符 - 我们只保留非空部分)

会得到你,因为

$parts

array 0 => string 'dog' (length=3) 1 => string 'cat' (length=3) 2 => string 'car' (length=3) 3 => string 'tea' (length=3) 4 => string 'pot' (length=3) 5 => string 'fly' (length=3) 6 => string 'cake' (length=4)

并且,对于

$str_out

string 'dog,cat,car,tea,pot,fly,cake' (length=28)



评论后编辑:抱歉,我没注意到那个^^

在这种情况下,你不能按空格分割:-(我可能会按 '

,

' 或 '
;
' 进行分割,迭代各个部分,使用 
trim
删除白色-每个项目的开头和结尾都有字符,并且只保留那些不为空的:

$useful_parts = array(); $parts = preg_split('/[,;]/', $str_in, -1, PREG_SPLIT_NO_EMPTY); foreach ($parts as $part) { $part = trim($part); if (!empty($part)) { $useful_parts[] = $part; } } var_dump($useful_parts);

执行这部分代码让我受益匪浅:

array 0 => string 'dog' (length=3) 1 => string 'cat' (length=3) 2 => string 'car' (length=3) 3 => string 'tea pot' (length=7) 4 => string 'fly' (length=3) 5 => string 'cake' (length=4)

这次我明白了,一切都在一起爆炸:

string 'dog,cat,car,tea pot,fly,cake' (length=28)

哪个更好;-)


1
投票
您可以使用

explode

trim
str_replace
 来获取数组,手动删除特定字符,然后将其转回数组。

function getCleanerStringFromString($stringIn) { ///turn the string into an array with a comma as the delimiter $myarray = explode(",",$stringin); for ($ii =0; $ii < count($myarray); $ii++) { ///remove new lines, semi colons, etc ///use this line as many times as you'd like to take out characters $myarray($ii) = str_replace(";","",$myarray($ii); ////remove white spaces $myarray($ii) = trim($myarray($ii)); } //then turn it back into an array: $backstring = implode(","$myarray); return $backstring; }
    

1
投票
Split 然后 grep,似乎给出了预期的输出:

$array = preg_split('/\s*[;,\n]\s*/', $string); $array = preg_grep('/^\s*$/', $array, PREG_GREP_INVERT); $string = implode(',', $array);

编辑:实际上 grep 不是必需的:

$array = preg_split('/\s*[;,\n]\s*/', $string, -1, PREG_SPLIT_NO_EMPTY); $string = implode(',', $array);
    

1
投票
在逗号上分解整个字符串,遍历该数组,首先匹配所有不是 a-zA-Z0-9 (和空格)的字符,然后修剪剩余的前导/尾随空格。如果为空,则从数组中取消设置该项目。内爆回绳子。

理想情况下,这允许使用比 ,;\s 更混乱的字符 等等

$strIn = "dog, cat ,car,tea pot,, ,,, ;;(++NEW LINE++)fly, cake"; $firstArray = explode(",", $strIn); $searchPattern = "/[^A-Za-z0-9 ]+/"; function removeViolators($item, $key) { preg_replace($searchPattern, "", $item); trim($item); if (empty($item)) { unset($item); } } array_walk($firstArray, removeViolators); $strOut = implode(",", $firstArray);
    

0
投票
我不建议生成临时数组。查找并替换一个或多个连续的定界字符 - 每个字符可能被零个或多个空格包围。

演示

$str_in = "dog, cat ,car,tea pot,, ,,, ;; fly, cake"; var_export( preg_replace( '#\s*(?:[:;,]+\s*)+#', ',', $str_in ) );
输出:

'dog,cat,car,tea pot,fly,cake'
    
© www.soinside.com 2019 - 2024. All rights reserved.