有没有办法用正则表达式替换所有不需要的数字和字符?
Is there a way to replace all unwanted numbers and characters with regex?
我们的网站在两个不同的输入中有一个 phone 数字,第一个你应该只能写 prefix(如 6151 等) 和第二个你应该写其他 数字(如 8844 057 等)。问题来了,因为这种方法不是真正的用户友好,当客户写下他们的 phone 号码时,他们要么在第一个 字段中写下整个数字(如 6151 8844 075) and/or 为不需要的国家添加 +49 前缀。
我已经尝试将 !preg_match 的正则表达式从 "@^[0-9 ]+$@" to "(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))"
更改为正则表达式,它有效但部分有效,并不能真正解决我的问题。尝试在输入下方添加小信息框,但这也不起作用*(11% 的客户仍然写错了 phone 数字)*
if (
(
$_POST[konto] != "" &&
!preg_match("(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto])
)
||
(
$_POST[konto] != "" &&
!preg_match("(\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto])
)
)
<div class="">
<p></p>
<div class="form-group">
<label for="" class="">
</label>
<div class="row">
<input type="hidden" name="" value="">
<input class="form-control rwd-text" id="" type="text" name="" value="" />
<div class="col-xs-5">
<input class="form-control rwd-text" id="" type="text" name="" value="">
</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="" type="text" name="" value="" />
</div>
</div>
<div class="row">
<div class="col-xs-15">
<div class="control-label"></div>
</div>
</div>
</div>
</div>
所以,我想知道是否有办法用 !preg_match、FILTER_SANITIZE_NUMBER_INT 或其他函数去除 phone 数字从 +49-6151/8844-057 到只有 6151 8844 057(所以没有无效字符) 并且第一次输入它发送第一个 prefix(6151 without +49 or 0049 or any other country prefix) 并且第二个输入只发送号码。我真的不知道如何做到这一点。任何帮助将不胜感激。
请注意
此代码严重依赖于严格的输入格式。 ++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);
我们的网站在两个不同的输入中有一个 phone 数字,第一个你应该只能写 prefix(如 6151 等) 和第二个你应该写其他 数字(如 8844 057 等)。问题来了,因为这种方法不是真正的用户友好,当客户写下他们的 phone 号码时,他们要么在第一个 字段中写下整个数字(如 6151 8844 075) and/or 为不需要的国家添加 +49 前缀。
我已经尝试将 !preg_match 的正则表达式从 "@^[0-9 ]+$@" to "(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))"
更改为正则表达式,它有效但部分有效,并不能真正解决我的问题。尝试在输入下方添加小信息框,但这也不起作用*(11% 的客户仍然写错了 phone 数字)*
if (
(
$_POST[konto] != "" &&
!preg_match("(\(?([\d \-\)\–\+\/\(]+){3,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto])
)
||
(
$_POST[konto] != "" &&
!preg_match("(\(?([\d \-\)\–\+\/\(]+){6,}\)?([ .\-–\/]?)([\d]+))", $_POST[konto])
)
)
<div class="">
<p></p>
<div class="form-group">
<label for="" class="">
</label>
<div class="row">
<input type="hidden" name="" value="">
<input class="form-control rwd-text" id="" type="text" name="" value="" />
<div class="col-xs-5">
<input class="form-control rwd-text" id="" type="text" name="" value="">
</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="" type="text" name="" value="" />
</div>
</div>
<div class="row">
<div class="col-xs-15">
<div class="control-label"></div>
</div>
</div>
</div>
</div>
所以,我想知道是否有办法用 !preg_match、FILTER_SANITIZE_NUMBER_INT 或其他函数去除 phone 数字从 +49-6151/8844-057 到只有 6151 8844 057(所以没有无效字符) 并且第一次输入它发送第一个 prefix(6151 without +49 or 0049 or any other country prefix) 并且第二个输入只发送号码。我真的不知道如何做到这一点。任何帮助将不胜感激。
请注意
此代码严重依赖于严格的输入格式。 ++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);