我有一串用括号括起来的数字:
(2)(56)(9)(12)(2)
有人将我的以下正则表达式从括号中删除了数字:
<?php
$string = '(2)(56)(9)(12)(2)';
$pattern = "/\\)\\(|\\(|\\)?/";
$numbers = preg_split($pattern, $string);
foreach ($numbers as $number) {
echo $number.'<br />';
}
?>
输出:
<br />
<br />
2<br />
<br />
5<br />
6<br />
<br />
9<br />
<br />
1<br />
2<br />
<br />
2<br />
<br />
<br />
当我真的需要输出时:
2<br />
56<br />
9<br />
12<br />
2<br />
如何改变正则表达式以使其有效?
P.S。括号之间的每个数字可以是无限长度。
答案 0 :(得分:3)
我首先不会使用preg_split。如果这确实是你的源字符串,那么只看数字:
preg_match_all("/\d+/", $string, $numbers);
print_r($numbers[0]);
答案 1 :(得分:2)
首先,正则表达式中存在错误。它应该是:
$pattern = "/\\)\\(|\\(|\\)/";
注意删除了最后一个?
。
简单的答案就是检查空数:
foreach ($numbers as $number) {
if ($number !== '') {
echo $number.'<br />';
}
}
请注意严格!==
测试,因为0
可能是有效数字...
或者,将PREG_SPLIT_NO_EMPTY
选项添加到preg_split
来电:
$numbers = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY);
另一种选择是将preg_match_all
与简单的正则表达式一起使用:/\d+/
:
$matches = array();
preg_match_all('/\d+/', $string, $matches);
$numbers = $matches[0];
答案 2 :(得分:2)
使用preg_match
代替分割,并使用/\\d+/
作为表达式
尝试
$string = '(2)(56)(9)(12)(2)';
$pattern = "/\d+/";
preg_match_all($pattern, $string, $numbers);
foreach ($numbers as $number) {
echo $number.'<br />';
}
我不确定PHP正则表达式语法是\\d
还是\d
答案 3 :(得分:1)
你只需要preg_split的PREG_SPLIT_NO_EMPTY选项,以及模式的一个小变化:
$pattern = "/\\)\\(|\\(|\\)/"; // removed the "?"
$numbers = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY); // added PREG_SPLIT_NO_EMPTY
或使用preg_match:
$string = '(2)(56)(9)(12)(2)';
preg_match_all('#\d+#', $string, $matches);
foreach ($matches[0] as $number) {
echo "$number<br />\n";
}
输出:
2<br />
56<br />
9<br />
12<br />
2<br />
答案 4 :(得分:1)
将标志PREG_SPLIT_NO_EMPTY
传递给不返回空标记并删除允许空分隔符的?
。您也不需要在PHP中双重转义()
。在preg_match
上使用(\d+)
看起来会对您的问题提供更简单的解决方案。
$string = '(2)(56)(9)(12)(2)';
$pattern = "/\)\(|\(|\)/";
$numbers = preg_split($pattern, $string, -1, PREG_SPLIT_NO_EMPTY);
foreach ($numbers as $number) {
echo "$number<br />\n";
}
输出:
2<br />
56<br />
9<br />
12<br />
2<br />