有没有办法用正则表达式替换所有不需要的数字和字符?

时间:2019-06-24 06:41:52

标签: php html regex preg-replace

我们的站点在两个不同的输入中都有一个电话号码,在第一个中您应该只能写p refix(如6151等),在第二个中您应该写其他数字(例如8844 057等)。问题来了,因为这种方法并不是真正的用户友好型,当客户写他们的电话号码时,他们要么在第一个字段中写出整个电话号码(例如6151 8844 075)和/或为国家/地区添加+49前缀不需要。

我曾尝试将{strong>!preg_match 的正则​​表达式从"@^[0-9 ]+$@" to "(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))"更改,但它的确有效,但不能完全解决我的问题。尝试在输入下方添加一些信息框,但均不起作用*(11%的客户仍然输入了错误的电话号码)*

if (
        (
            $_POST[konto][vorwahl] != "" &&
            !preg_match("(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto][vorwahl])
        )
        ||
        (
            $_POST[konto][telefon] != "" &&
            !preg_match("(\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto][telefon])
        )
    ) {
        $ausgabe[error][telefon_falsch] = $sh_var_[kundenkonto][$param[shop][was][1]][$param[shop][was][2]][telefon_falsch];
        $ausgabe[error][anzahl]++;
    }
<div class="meldung_wrapper">
            <p><?=$sprachdatei['konto_rechnungsdaten']['kontakt_aufnahmen']?></p>

            <div class="form-group <?=($ausgabe["error"]["telefon_falsch"] ? "has-feedback has-error" : "")?>">
                <label for="<?=($vorwahl_ausblenden ? "bestellung_telefon" : "bestellung_vorwahl")?>" class="control-label">
                    <?=$sprachdatei['formlabels']['telefon']?><? if ($tmp_f > 0): ?>*<? endif; ?>
                </label>

                <div class="row">
                    <? if ($vorwahl_ausblenden): ?>
                        <input type="hidden" name="bestellung[vorwahl]" value="<?=$ausg["vorwahl"]?>">
                        <input class="form-control rwd-text" id="bestellung[telefon]" type="text" name="bestellung[telefon]" value="<?=$ausg["telefon"]?>" />
                    <? else: ?>
                        <div class="col-xs-5">
                            <input class="form-control rwd-text" id="bestellung[vorwahl]" type="text" name="bestellung[vorwahl]" value="<?=$ausg["vorwahl"]?>">
                        </div>
                        <div class="col-xs-2 text-center h3 margin-top-0">/</div>

                        <div class="col-xs-8">
                            <input class="form-control rwd-text" id="bestellung[telefon]" type="text" name="bestellung[telefon]" value="<?=$ausg["telefon"]?>" />
                        </div>
                    <? endif; ?>

                    <? if ( ($tmp_f > 0) && (!isset($ausgabe[error][telefon])) ): ?>
                        <?=$sh_var_[warenkorb][$param[shop][was][1]][$param[shop][was][2]][info_telefonnummer]?>
                    <? else: ?>
                        <? print_r( $ausgabe[error][telefon]); ?>
                    <? endif; ?>
                </div>

                <div class="row">
                    <div class="col-xs-15">
                        <div class="meldung control-label"><?=$ausgabe["error"]["telefon_falsch"]?></div>
                    </div>
                </div>
            </div>
        </div>

因此,我想知道是否可以使用!preg_match, FILTER_SANITIZE_NUMBER_INT 或其他功能从 + 49-6151 / 8844-057 中删除电话号码>仅发送给 6151 8844 057(因此没有无效字符),并且对于第一个输入,它仅发送第一个前缀(6151,不带+49或0049或任何其他国家/地区前缀)第二个输入仅发送该号码。我真的不知道如何实现这一目标。任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:1)

请当心

此代码严重依赖严格的输入格式。像++496151之类的前缀将不起作用。您应在数据库中搜索奇数格式并在运行此代码之前对其进行更正!


像这样?这是JavaScript代码,但可以翻译成php

"use strict";
console.clear()

const input = [
  {
    prefix: "+49-6151", 
    number: "8844-057",
  },
  {
    prefix: "0049-6151", 
    number: "8844-057",
  },
  {
    prefix: "++49 06151", 
    number: "8844-057",
  },
]

function fixPrefix(prefix) {
  prefix = prefix
    // remove leading '+', '++', and '00' and following digits
    .replace(/^(\+{1,2}|00)\d+/, '')
    // split at none digits
    .split(/\D/)
    // remove empty elements
    .filter(i=>i)
    // rejoin
    .join()
    // add one lleading zero if none is present
    .replace(/^(?!0)/, 0)
  return prefix
}

function fixNumber(number) {
  number = number
    // split at any none digit
    .split(/\D/)
    // remove empty elements
    .filter(i=>i)
    // rejoin with space in between
    .join(" ")
  return number
}

let output = input.map(i => {
 return {
   prefix: fixPrefix(i.prefix),
   number: fixNumber(i.number),
 } 
})

console.info('Input')
console.log(input)
console.info('Output')
console.log(output)

PHP代码是这样的(在3v4l.org上可以在这里进行操作:https://3v4l.org/uRM6S

<?php

$input = [
    [
        "prefix" => "+49-6151", 
        "number" => "8844-057",
    ],
    [
        "prefix" => "0049-6151", 
        "number" => "8844-057",
    ],
    [
        "prefix" => "++49 06151", 
        "number" => "8844-057",
    ],
];



function fixPrefix($prefix) {
    $prefix = preg_replace("/^(\+{1,2}|00)\d+/", '', $prefix);
    $prefix = preg_split("/\D/", $prefix);
    $prefix = array_filter($prefix, function($i) {return !!$i;});
    $prefix = implode($prefix);
    $prefix = preg_replace("/^(?!0)/", "0", $prefix);

    return $prefix;
}

function fixNumber($number) {
    $number = preg_split("/\D/", $number);
    $number = array_filter($number, function($i) {return !!$i;});
    $number = implode($number, " ");
    return $number;
}

$output = array_map(
    function($i) {
    return [
        "prefix" => fixPrefix($i["prefix"]),
        "number" => fixNumber($i["number"]),
    ];
}, $input);

print_r("Input\n");
print_r($input);
print_r("Output\n");
print_r($output);