Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/235.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数字子串_Php_Numbers_Substring - Fatal编程技术网

PHP数字子串

PHP数字子串,php,numbers,substring,Php,Numbers,Substring,我怎样才能找到字符串中包含的所有数字,除了那些还有字母的数字(如A1)? 例如,在字符串“saddfs 2300 dfsfd 45 A3 A6”中,我只想得到2300和45 我知道 preg_match_all('!\d+!', $string, $nums); 我可以找到所有的数字,但我不想找到A3和A6的数字 谢谢 只需使用单词边界或字符串边界: preg_match_all('!(^|\b)\d+(\b|$)!', $string, $nums); 一些测试: php > pre

我怎样才能找到字符串中包含的所有数字,除了那些还有字母的数字(如A1)? 例如,在字符串“saddfs 2300 dfsfd 45 A3 A6”中,我只想得到2300和45

我知道

preg_match_all('!\d+!', $string, $nums);
我可以找到所有的数字,但我不想找到A3和A6的数字


谢谢

只需使用单词边界或字符串边界:

preg_match_all('!(^|\b)\d+(\b|$)!', $string, $nums);
一些测试:

php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 2300
    [1] => 45
)
php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 2300
    [1] => 45
    [2] => 123
)
php > preg_match_all('!(^|\b)[0-9]+(\b|$)!', '789 saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 789
    [1] => 2300
    [2] => 45
    [3] => 123
)

更新:根据Zsolt Szilagy的建议将
\d
更改为
[0-9]

只需使用单词边界或字符串边界:

preg_match_all('!(^|\b)\d+(\b|$)!', $string, $nums);
一些测试:

php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 2300
    [1] => 45
)
php > preg_match_all('!(^|\b)\d+(\b|$)!', 'saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 2300
    [1] => 45
    [2] => 123
)
php > preg_match_all('!(^|\b)[0-9]+(\b|$)!', '789 saddfs 2300 dfsfd 45 A3 A6 123', $nums);
php > print_r($nums[0]);
Array
(
    [0] => 789
    [1] => 2300
    [2] => 45
    [3] => 123
)

更新:根据Zsolt Szilagy的建议,将
\d
更改为
[0-9]

非健壮、快速、肮脏且错误的解决方案:

$ php -a
Interactive shell

php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
    [0] => Array
        (
            [0] =>  2300
            [1] =>  45
        )

)
根据Aleks G的建议更新,列出此解决方案的缺陷:

$ php -a
Interactive shell

php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
    [0] => Array
        (
            [0] =>  2300
            [1] =>  45
        )

)
第一个问题:这无法匹配字符串严格开头或结尾的纯数字。要做到这一点,请遵循Aleks G模式,该模式将锚定字符置于捕获子模式中:

preg_match_all('/(^|\W)\d+(\W|$)/', '2300 df A6 242 sfd 45', $matches);
您可以将模式设置为非捕获(
”/(?:^\W)\d+(?:\W$)/“
),以表明括号是用于分组的,而不是用于捕获的,但这完全是可选的,因为您仍然希望保留在
$匹配[0]
中的值

第二个问题:\b和\W不完全相同\b是“单词边界”,而\W是“非单词字符”。将Aleks G的结果与我的答案进行比较,您将看到\b返回纯数字,而\W返回周围的空间


更新根据Zsolt Szilagy注释,\d匹配当前字符集中的数字,因此对于具有更多数字字符的语言(如中文),您将无法获得预期的0到9。为此使用字符类[0-9]。

非健壮、快速、肮脏——以及错误——解决方案:

$ php -a
Interactive shell

php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
    [0] => Array
        (
            [0] =>  2300
            [1] =>  45
        )

)
根据Aleks G的建议更新,列出此解决方案的缺陷:

$ php -a
Interactive shell

php > preg_match_all('/\W\d+\W/', 'saddfs 2300 dfsfd 45 A3 A6', $matches);
php > print_r($matches);
Array
(
    [0] => Array
        (
            [0] =>  2300
            [1] =>  45
        )

)
第一个问题:这无法匹配字符串严格开头或结尾的纯数字。要做到这一点,请遵循Aleks G模式,该模式将锚定字符置于捕获子模式中:

preg_match_all('/(^|\W)\d+(\W|$)/', '2300 df A6 242 sfd 45', $matches);
您可以将模式设置为非捕获(
”/(?:^\W)\d+(?:\W$)/“
),以表明括号是用于分组的,而不是用于捕获的,但这完全是可选的,因为您仍然希望保留在
$匹配[0]
中的值

第二个问题:\b和\W不完全相同\b是“单词边界”,而\W是“非单词字符”。将Aleks G的结果与我的答案进行比较,您将看到\b返回纯数字,而\W返回周围的空间


更新根据Zsolt Szilagy注释,\d匹配当前字符集中的数字,因此对于具有更多数字字符的语言(如中文),您将无法获得预期的0到9。使用字符类[0-9]。

这不适用于字符串开头或结尾的数字。使用字符串“saddfs 2300 dfsfd 45 A3 A6 123”测试您的代码。-最后一个
123
将不匹配。@AleksG:我知道这一点。有些事情必须留给读者来决定。如果你意识到了这一点并有意让OP来决定,你应该在回答中明确说明。否则,它会给人以草率或懒惰的印象。这不适用于字符串开头或结尾的数字。使用字符串“saddfs 2300 dfsfd 45 A3 A6 123”测试您的代码。-最后一个
123
将不匹配。@AleksG:我知道这一点。有些事情必须留给读者来决定。如果你意识到了这一点并有意让OP来决定,你应该在回答中明确说明。否则它会给人留下马虎或懒惰的印象。顺便说一句,您可能想用[0-9]替换\d\d还可以找到中文、泰文和日文数字(总共超过1000个字符),这些数字在处理无效编码的数据时可能会绕过安全检查并破坏数据库。顺便说一句,您可能希望将\d替换为[0-9]\d还可以找到中文、泰文和日文数字(总共超过1000个字符),这些数字可以绕过安全检查,在处理无效编码的数据时破坏数据库。