Php 正则表达式,仅允许字符串中包含整数和逗号

Php 正则表达式,仅允许字符串中包含整数和逗号,php,regex,preg-replace,Php,Regex,Preg Replace,有人知道字符串只允许整数和逗号的preg_替换是什么吗?我想去掉所有空格、字母、符号等,所以剩下的只是数字和逗号,但字符串中没有任何前导或训练逗号。(示例:5,7,12) 这就是我现在使用的,它只在逗号前后去掉空格,但我认为它允许其他任何东西 $str = trim(preg_replace('|\\s*(?:' . preg_quote($delimiter) . ')\\s*|', $delimiter, $str)); 这应该满足您的需要: $str = preg_replace(

有人知道字符串只允许整数和逗号的preg_替换是什么吗?我想去掉所有空格、字母、符号等,所以剩下的只是数字和逗号,但字符串中没有任何前导或训练逗号。(示例:5,7,12)

这就是我现在使用的,它只在逗号前后去掉空格,但我认为它允许其他任何东西

$str = trim(preg_replace('|\\s*(?:' . preg_quote($delimiter) . ')\\s*|', $delimiter, $str));

这应该满足您的需要:

$str = preg_replace(
  array(
    '/[^\d,]/',    // Matches anything that's not a comma or number.
    '/(?<=,),+/',  // Matches consecutive commas.
    '/^,+/',       // Matches leading commas.
    '/,+$/'        // Matches trailing commas.
  ),
  '',              // Remove all matched substrings.
  $str
);
$str=preg\u replace(
排列(
“/[^\d,]/',//匹配任何不是逗号或数字的内容。

“/(?以下是你问题的答案:

//drop all characters except digits and commas
    preg_match_all('/[\\d,]/', $subject, $result, PREG_PATTERN_ORDER);
    $result = implode('', $result[0]);

//strip the empty or trailing commas
    if( preg_match('/^,*(\\d.*?\\d),*$/', $result, $regs) ){
        $result = $regs[1];
    }
但是您可能想改用这个函数

听起来像是我曾经写过的函数。请参阅:


我知道这并不是你想要的,但每次我尝试它时,它都会返回格式正确的字符串

$string = ", 3,,,,, , 2 4 , , 3 , 2 4 ,,,,,";
//remove spaces
$string = preg_replace("[\s]","",$string);
// remove commas
$array = array_filter(explode(",",$string));
// reassemble
$string = implode(",",$array);

print_r($string);

返回
3,24,3,24

这是我在大家的帮助下提出的一个函数。它适用于逗号,但不适用于任何其他分隔符

if (!function_exists('explode_trim_all')) {
  function explode_trim_all($str, $delimiter = ',') {
    if ( is_string($delimiter) ) {
      $str = preg_replace(
        array(
          '/[^\d'.$delimiter.']/', // Matches anything that's not a delimiter or number.
          '/(?<='.$delimiter.')'.$delimiter.'+/', // Matches consecutive delimiters.
          '/^'.$delimiter.'+/',                   // Matches leading delimiters.
          '/'.$delimiter.'+$/'                    // Matches trailing delimiters.
        ),
        '',              // Remove all matched substrings.
        $str
      );
      return explode($delimiter, $str);
    }
    return $str;
  }
}
如果(!function_存在('explode_trim_all')){
函数explode\u trim\u all($str,$delimiter=',')){
if(is_字符串($delimiter)){
$str=预更换(
排列(
“/[^\d.”$delimiter.]/',//匹配任何非分隔符或数字的内容。

'/(?PS。我强烈推荐快速创建和测试正则表达式模式。它甚至可以为您编写PHP代码。您可以通过将异常包装在try-catch块中来抑制异常。如果它不去除除整数和逗号以外的所有内容,那么这将无法满足我的需要。但我非常感谢您的响应。你们太棒了这里!;)这个函数上面的代码怎么样?除了数字和逗号之外,它去掉了所有的字符。你能提供一些预期输入和输出的示例吗?:-)是的,先生,我能。我知道这很牵强,但有些人会试图克服这个问题。他们会尝试类似的方法,例如:,(3,,,,,2喂?4,发生什么事了?,,3,2!@$%^4,,,,,),无括号。最后应该是3,24。可能会有更多的数字是设置,但这是想法的要点。我不知道如何在这里的评论框中显示它。我需要它只显示像3,24,56,75,5等。如果听起来很混乱,很抱歉。这是完美的,除了它不会删除空格和ot后的匹配数字如果你在最后一行的意思是这样的话,她的东西会被移除。(例如:,3,,,,,2 4,,,3,2 4,,,,,,)返回3,24,3,24)我想有一个更好的方法来做这件事,但我似乎什么都做不了。我可以使用array_unique来捕捉复制,所以这应该可以完成工作。非常感谢你的快速回答。布鲁克,第二个逗号(括号后+之前)在这行中做什么?“/(?@Rob
(?您的第一个代码适用于逗号或数字以外的任何代码。但是这些代码不适用,因为2 4是一个不分开的数字。因此,它应该是:3,24,3,24。除逗号(或您选择的任何分隔符)以外的任何代码)和数字。我已经更改了代码,它现在将删除空格并对数字进行分组,同时仍保持所需的分隔。如果要使其更具动态性,只需使用您选择的变量或分隔符替换“
”、“
”。如果您更改了“
”/(?)?
if (!function_exists('explode_trim_all')) {
  function explode_trim_all($str, $delimiter = ',') {
    if ( is_string($delimiter) ) {
      $str = preg_replace(
        array(
          '/[^\d'.$delimiter.']/', // Matches anything that's not a delimiter or number.
          '/(?<='.$delimiter.')'.$delimiter.'+/', // Matches consecutive delimiters.
          '/^'.$delimiter.'+/',                   // Matches leading delimiters.
          '/'.$delimiter.'+$/'                    // Matches trailing delimiters.
        ),
        '',              // Remove all matched substrings.
        $str
      );
      return explode($delimiter, $str);
    }
    return $str;
  }
}