Есть ли способ заменить все ненужные цифры и символы на регулярные выражения? - PullRequest
2 голосов
/ 24 июня 2019

Наш сайт имеет телефонный номер в двух разных входах, во-первых вы должны быть в состоянии написать только p refix (например, 6151 и т. Д.) , а во втором вы должны написать другие номера (например, 8844 057 и т. д.) . Проблема возникает, так как этот подход не очень удобен для пользователя, когда клиент записывает свои номера телефонов, они либо пишут целое число в первом поле (например, 6151 8844 075) и / или добавляют префикс +49 для страны, которая не нужен.

Я пытался изменить регулярное выражение для ! 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 Ответ

1 голос
/ 24 июня 2019

Пожалуйста, будьте осторожны

Этот код сильно зависит от строгого формата ввода.Префиксы типа ++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);
...