从数组中获取破折号“-”后的数字,并将破折号保留在原来的位置。正则表达式
Get numbers after dash "-" from an array and preserve dash in his original position. Regex
其他线程的用户帮助我弄清楚如何从数组中获取数字,但现在我无法在“-”破折号之后获取数字。让我向您展示我所拥有的并让您了解情况。
我有一个包含以下内容的数组:
Array(
[0] => <tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>
[1] => <tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>
[2] => <tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>
[3] => <tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>
)
终于知道如何获取每个数字了(破折号“-”后的数字除外):
$re = "/.*?(\d+)\s.*?(\d+)\s.*/m";
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
$subst = ", ";
$result = preg_replace($re, $subst, $str);
这是$结果;输出:
foreach($result as $finalresult) echo $finalresult.'<br>';
12345,67899
98545,67659
59675,94859
69365,78464
我从所有这个过程中期望但无法弄清楚的是也得到破折号“-”后的数字:
12345,67899-12
98545,67659-32
59675,94859-11
69365,78464-63
但这并没有就此结束...当破折号“-”后的数字低于 50 时,我需要转换 $result 输出。请参见下面的示例。
如果“-”之后的数字 < 50 则需要对其进行转换,取第一个数字并将其放在单位位置。那么十位可能为零。
当为 50 或以上时,数字保持不变。示例:
12345,67899-12 ------> 12345,67899-01
98545,67659-32 ------> 12345,67899-03
59675,94859-11 ------> 12345,67899-01
52375,53259-49 ------> 12345,67899-04
69365,73464-63 ------> 12345,67899-63
89765,12332-51 ------> 12345,67899-51
38545,54213-70 ------> 12345,67899-70
现在是我脑袋爆炸的时候!
在此先感谢很多的帮助。
这可能就是您要找的。我稍微修改了你的正则表达式。 (.*?<td>){3}
将匹配第三个 <td>
之前的任何内容。子模式 (?P<first>\d+)
等中的 ?P<first>
称为命名子模式,这使得它们的值易于从 $matches
数组访问。
$a = [
'<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>',
'<tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>',
'<tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>',
'<tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>',
];
$result = [];
foreach ($a as $row) {
$p = '#(.*?<td>){3}(?P<first>\d+).*?</td><td>(?P<second>\d+).*?(?P<third>\d+)#';
if (preg_match($p, $row, $matches)) {
if ($matches['third'] < 50) {
$matches['third'] = '0'.$matches['third'][0];
}
$result[] =
$matches['first'] . ',' .
$matches['second'] . '-' .
$matches['third'];
}
}
print_r($result);
输出:
Array
(
[0] => 12345,67899-01
[1] => 98545,67659-03
[2] => 59675,94859-01
[3] => 69365,78464-63
)
这将为您解决问题:
$re = '/.*?(\d+)\s.*?(\d+)\s.*?-\s(\d+).*/';
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
preg_match($re, $str, $matches);
if ($matches[3]<50) $matches[3] = floor($matches[3]/10);
$format = '%d,%d-%02d';
$result = sprintf($format, $matches[1], $matches[2], $matches[3]);
echo $result;
请注意,为了便于阅读,我将您的 $re
更改为单引号而不是双引号,并且我使用 preg_match
而不是 preg_replace
这样我就可以使用匹配的图案。
为了向您解释正则表达式,需要做一些事情:
/
是正则表达式分隔符。
.*?
:.
告诉正则表达式匹配任何字符。 *
表示执行零次或多次,?
表示以 "lazy" 方式执行。 $re
末尾的普通 .*
匹配字符串的整个其余部分。
(\d+)
:\d
是一个通配符,告诉正则表达式匹配任何数字。 +
表示 "one or more times",而 ()
表示捕获它。第一个()
包围的组是$matches[1]
.
\s
: 是任何space字符的通配符。
-
:是字面的-
字符。
嗯...我不知道它是否有帮助,但我用 RegExr 做了这个并且它很合适:
(([0-9]+){5})|(- [0-9]{2})
希望你会觉得它有用!
其他线程的用户帮助我弄清楚如何从数组中获取数字,但现在我无法在“-”破折号之后获取数字。让我向您展示我所拥有的并让您了解情况。
我有一个包含以下内容的数组:
Array(
[0] => <tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>
[1] => <tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>
[2] => <tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>
[3] => <tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>
)
终于知道如何获取每个数字了(破折号“-”后的数字除外):
$re = "/.*?(\d+)\s.*?(\d+)\s.*/m";
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
$subst = ", ";
$result = preg_replace($re, $subst, $str);
这是$结果;输出:
foreach($result as $finalresult) echo $finalresult.'<br>';
12345,67899
98545,67659
59675,94859
69365,78464
我从所有这个过程中期望但无法弄清楚的是也得到破折号“-”后的数字:
12345,67899-12
98545,67659-32
59675,94859-11
69365,78464-63
但这并没有就此结束...当破折号“-”后的数字低于 50 时,我需要转换 $result 输出。请参见下面的示例。 如果“-”之后的数字 < 50 则需要对其进行转换,取第一个数字并将其放在单位位置。那么十位可能为零。 当为 50 或以上时,数字保持不变。示例:
12345,67899-12 ------> 12345,67899-01
98545,67659-32 ------> 12345,67899-03
59675,94859-11 ------> 12345,67899-01
52375,53259-49 ------> 12345,67899-04
69365,73464-63 ------> 12345,67899-63
89765,12332-51 ------> 12345,67899-51
38545,54213-70 ------> 12345,67899-70
现在是我脑袋爆炸的时候!
在此先感谢很多的帮助。
这可能就是您要找的。我稍微修改了你的正则表达式。 (.*?<td>){3}
将匹配第三个 <td>
之前的任何内容。子模式 (?P<first>\d+)
等中的 ?P<first>
称为命名子模式,这使得它们的值易于从 $matches
数组访问。
$a = [
'<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>',
'<tr><td>12/03/2015</td><td>10:12</td><td>98545 Column information</td><td>67659 Column information - 32</td><td>Information</td><td>More information</td></tr>',
'<tr><td>11/02/2015</td><td>12:40</td><td>59675 Column information</td><td>94859 Column information - 11</td><td>Information</td><td>More information</td></tr>',
'<tr><td>01/01/2015</td><td>20:12</td><td>69365 Column information</td><td>78464 Column information - 63</td><td>Information</td><td>More information</td></tr>',
];
$result = [];
foreach ($a as $row) {
$p = '#(.*?<td>){3}(?P<first>\d+).*?</td><td>(?P<second>\d+).*?(?P<third>\d+)#';
if (preg_match($p, $row, $matches)) {
if ($matches['third'] < 50) {
$matches['third'] = '0'.$matches['third'][0];
}
$result[] =
$matches['first'] . ',' .
$matches['second'] . '-' .
$matches['third'];
}
}
print_r($result);
输出:
Array
(
[0] => 12345,67899-01
[1] => 98545,67659-03
[2] => 59675,94859-01
[3] => 69365,78464-63
)
这将为您解决问题:
$re = '/.*?(\d+)\s.*?(\d+)\s.*?-\s(\d+).*/';
$str = "<tr><td>29/06/2015</td><td>19:35</td><td>12345 Column information</td><td>67899 Column information - 12</td><td>Information</td><td>More information</td></tr>";
preg_match($re, $str, $matches);
if ($matches[3]<50) $matches[3] = floor($matches[3]/10);
$format = '%d,%d-%02d';
$result = sprintf($format, $matches[1], $matches[2], $matches[3]);
echo $result;
请注意,为了便于阅读,我将您的 $re
更改为单引号而不是双引号,并且我使用 preg_match
而不是 preg_replace
这样我就可以使用匹配的图案。
为了向您解释正则表达式,需要做一些事情:
/
是正则表达式分隔符。.*?
:.
告诉正则表达式匹配任何字符。*
表示执行零次或多次,?
表示以 "lazy" 方式执行。$re
末尾的普通.*
匹配字符串的整个其余部分。(\d+)
:\d
是一个通配符,告诉正则表达式匹配任何数字。+
表示 "one or more times",而()
表示捕获它。第一个()
包围的组是$matches[1]
.\s
: 是任何space字符的通配符。-
:是字面的-
字符。
嗯...我不知道它是否有帮助,但我用 RegExr 做了这个并且它很合适:
(([0-9]+){5})|(- [0-9]{2})
希望你会觉得它有用!