我想从字符串中提取一个数字。该字符串看起来像这样:
"visaObs(31124228);"
这是我的尝试。似乎没有得到任何匹配:
preg_match('/visaObs((\d+));/s', $attribute, $match);
echo $match[0]; //undefined offset
有什么想法吗?
您必须转义括号:
/visaObs\((\d+)\);/
不需要 s 修饰符,并且您的结果位于
$match[1]
中,因为它是第一个捕获组。
你必须逃离
(
和)
:
preg_match('/visaObs[(](\d+)[)];/s', $attribute, $match);
示例:
$ cat /tmp/1.php
<?
$attribute = "visaObs(31124228);";
preg_match('/visaObs[(](\d+)[)];/s', $attribute, $match);
print $match[1];
?>
$ php /tmp/1.php
31124228
如果提供了
matches
,则用搜索结果填充。 $matches[0]
将包含与完整模式匹配的文本,$matches[1]
将包含与第一个捕获的带括号的子模式匹配的文本,依此类推。
在正则表达式中,括号是一个特殊字符。您应该避开数字周围的括号
preg_match('/visaObs\((\d+)\);/s', $attribute, $match);
您可以通过匹配任意数量的数字来找到仅该数字,并包括其周围的内容:
preg_match('/(?<=visaObs\()\d+(?=\))/', $attribute, $match);
var_dump($match);
您不必被迫使用正则表达式或 preg_ 函数来扫描此可预测格式的文本。作为提取过程的一部分,
sscanf()
甚至可以将子字符串转换为整数。不需要转义括号,也不需要匹配数组。
代码:(演示)
$str = 'visaObs(31124228);';
sscanf($str, 'visaObs(%d)', $integer);
var_export($integer); // 31124228