我想从一个字符串中提取一个数字。字符串看起来像这样:
"visaObs(31124228);"
我的机会来了。它似乎没有得到任何匹配:
preg_match('/visaObs((\d+));/s', $attribute, $match); echo $match[0]; //undefined offset
有什么想法吗?
exdqitrt1#
必须转义文字括号:
/visaObs\((\d+)\);/
s修饰符是不需要的,结果是$match[1],因为它是第一个捕获组。
$match[1]
rkue9o1l2#
必须转义(和):
(
)
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]将包含匹配第一个捕获的带括号的子模式的文本,依此类推。
matches
$matches[0]
$matches[1]
ki0zmccv3#
在正则表达式中,括号是一个特殊字符。你应该去掉数字周围的括号
preg_match('/visaObs\((\d+)\);/s', $attribute, $match);
7kqas0il4#
您可以通过匹配任意数量的数字来找到 * 仅 * 数字,并包括它周围的内容:
preg_match('/(?<=visaObs\()\d+(?=\))/', $attribute, $match); var_dump($match);
iaqfqrcu5#
您不必使用regex或preg_ function来扫描这种可预测格式的文本。sscanf()甚至可以将子字符串转换为整数作为其提取过程的一部分。不需要转义括号,也不需要匹配数组。代码:(Demo)
sscanf()
$str = 'visaObs(31124228);'; sscanf($str, 'visaObs(%d)', $integer); var_export($integer); // 31124228
5条答案
按热度按时间exdqitrt1#
必须转义文字括号:
s修饰符是不需要的,结果是
$match[1]
,因为它是第一个捕获组。rkue9o1l2#
必须转义
(
和)
:范例:
如果提供了
matches
,则它将填充搜索结果。$matches[0]
将包含匹配完整模式的文本,$matches[1]
将包含匹配第一个捕获的带括号的子模式的文本,依此类推。ki0zmccv3#
在正则表达式中,括号是一个特殊字符。你应该去掉数字周围的括号
7kqas0il4#
您可以通过匹配任意数量的数字来找到 * 仅 * 数字,并包括它周围的内容:
iaqfqrcu5#
您不必使用regex或preg_ function来扫描这种可预测格式的文本。
sscanf()
甚至可以将子字符串转换为整数作为其提取过程的一部分。不需要转义括号,也不需要匹配数组。代码:(Demo)