我们的站点在两个不同的输入中都有一个电话号码,在第一个中您应该只能写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或任何其他国家/地区前缀)第二个输入仅发送该号码。我真的不知道如何实现这一目标。任何帮助将不胜感激。
答案 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);