除数字、字母x和加号以外的所有内容删除(正则表达式,PHP)

4
许多类似的问题存在,我尝试了几个生成器,但好像找不到一个匹配的正则表达式。假设我有一个电话号码长这样:“345-324-3243 X039”,我想删除除数字、字母x和加号(出现在国际号码中)以外的所有内容。
这是我的当前无效的正则表达式和代码:
$phone = "345-324-3243 X039";
preg_replace('[^\d|x|\+]', '', $phone);

我希望它输出的是"3453243243X039",但实际却输出了"30234-2349"。

3个回答

9

在字符类中去掉字面上的|,确保捕获大写字母 "X"(连同小写字母"x"),使用正则表达式 "/引号/"(否则它会将其视为"[引号]"),并使用结果

$phone = "345-324-3243 X039";
$phone = preg_replace('/[^\dxX+]/', '', $phone);
// $phone is 3453243243X039

愉快的编码。


1

从你的正则表达式中删除 | 并转义 +


1
+ 已经被转义了,即使在字符类内部不需要转义。你关于 | 是不必要的是正确的,但它不应该影响此输入的结果。 - Justin Morgan

1

所以你不仅在结果中得到了残留的-字符,而且还得到了完全不同的数字?这对我来说很奇怪。你不能仅通过删除字符就从345-324-3243 X039得到30234-2349;那个输入中唯一的0就在最后面。这就像字符被重新洗牌一样,除了删除之外。

我注意到你的模式周围没有正则表达式分隔符。我甚至不知道这会有什么影响,因为我不记得曾经尝试过,但这是你的正则表达式中唯一的功能问题。你字符类内部的|将被解释为字面上的|字符,但这不应该影响你发布的示例输入的结果。

我会使用以下代码:

$phone = preg_replace('/[^\dx+]/i', '', $phone);

我已经将正则表达式用/.../分隔符包装起来,去掉了|,取消了+的转义(在字符类中不应该有任何影响),并且忽略大小写以捕获大写字母X。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接