Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/260.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP解析字符串以删除speicifc字符_Php_Regex_String_Trim - Fatal编程技术网

使用PHP解析字符串以删除speicifc字符

使用PHP解析字符串以删除speicifc字符,php,regex,string,trim,Php,Regex,String,Trim,我有以下格式的字符串: ABC 318 XY2388 或 ABC 318 XY02388 我希望他们成为“ABC 318/XY 2388”。因此,如果在第二批字母之后有任何前导零,则删除它们 使用下面的代码,我成功地获得了如下输出 ABC 318/XY 2388 ABC 318/XY 02388(错误!) 有谁能建议一种方法,我可以修剪0(零)了吗 因此,如果我通过以下考试: ABC 318 XY2388 或 ABC 318 XY02388 最终输出应为 ABC 318/XY 2388*表示“重

我有以下格式的字符串:

ABC 318 XY2388

ABC 318 XY02388

我希望他们成为“ABC 318/XY 2388”。因此,如果在第二批字母之后有任何前导零,则删除它们

使用下面的代码,我成功地获得了如下输出

ABC 318/XY 2388

ABC 318/XY 02388(错误!)

有谁能建议一种方法,我可以修剪0(零)了吗

因此,如果我通过以下考试:

ABC 318 XY2388

ABC 318 XY02388

最终输出应为 ABC 318/XY 2388

*
表示“重复0次或更多次”,因此您可以选择每个匹配项。您的正则表达式甚至会匹配字符串
[SPACE][SPACE]
A[SPACE][SPACE]A

正则表达式
/([A-Z]+)([0-9]+)([A-Z]+)0?([0-9]+)/
会工作得更好

这是一份验尸报告和一份尸检报告:

  • ([A-Z]+)
    -将A-Z之间的字母重复1次或多次匹配的捕获组(这就是
    +
    的意思)
  • [SPACE]
    -文本空格字符
  • ([0-9]+)
    -与0到9之间的数字匹配的捕获组重复1次或多次
  • [SPACE]
    -文本空格字符
  • ([A-Z]+)
    -与第一个相同。与A-Z匹配的捕获组重复1次或多次
  • 0?
    -文本
    0
    字符重复0或1次(因此是可选的)
  • ([0-9]+)
    -与0到9之间的数字匹配的捕获组重复1次或多次

PHP代码:

<?php
    $input = "ABC 318 XY2388";
    $output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)0?([0-9]+)/", "$1 $2/$3 $4", $input);
    var_dump($output); //string(15) "ABC 318/XY 2388"

    $input = "ABC 318 XY02388";
    $output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)0?([0-9]+)/", "$1 $2/$3 $4", $input);
    var_dump($output); //Same as above, as 0 is optional: string(15) "ABC 318/XY 2388"
?>

只需添加一个简单的建议:如果您需要在0年代中期修剪一个或多个,也许您可以:

$input = "ABC 318 XY0002388";
$output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)(0*)([0-9]+)/", "$1 $2/$3 $5", $input);
var_dump($output); //should be "ABC 318/XY 2388"
请注意,我正在将“中间0”保存在$4上,但$4不是输出的一部分

我还没有测试过它,但它应该可以工作,也许如果你不在括号中加上“(0*)”,它可以在不保存0的情况下与“$1$2/$3$4”一起工作


我希望这会有所帮助。

是否允许0在任何地方或起点以外的任何地方?是的,0在起点以外的任何地方都允许
$input = "ABC 318 XY0002388";
$output = preg_replace("/([A-Z]+) ([0-9]+) ([A-Z]+)(0*)([0-9]+)/", "$1 $2/$3 $5", $input);
var_dump($output); //should be "ABC 318/XY 2388"