如何编写这个PHP正则表达式?

时间:2011-01-22 16:13:15

标签: php regex

我有一串用括号括起来的数字:

(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。括号之间的每个数字可以是无限长度。

5 个答案:

答案 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 />

http://ideone.com/zxvYi