regex 从看起来像带1个参数的函数调用的字符串中提取number

z4iuyo4d  于 12个月前  发布在  其他
关注(0)|答案(5)|浏览(87)

我想从一个字符串中提取一个数字。字符串看起来像这样:

"visaObs(31124228);"

我的机会来了。它似乎没有得到任何匹配:

preg_match('/visaObs((\d+));/s', $attribute, $match);
echo $match[0]; //undefined offset

有什么想法吗?

exdqitrt

exdqitrt1#

必须转义文字括号:

/visaObs\((\d+)\);/

s修饰符是不需要的,结果是$match[1],因为它是第一个捕获组。

rkue9o1l

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]将包含匹配第一个捕获的带括号的子模式的文本,依此类推。

ki0zmccv

ki0zmccv3#

在正则表达式中,括号是一个特殊字符。你应该去掉数字周围的括号

preg_match('/visaObs\((\d+)\);/s', $attribute, $match);
7kqas0il

7kqas0il4#

您可以通过匹配任意数量的数字来找到 * 仅 * 数字,并包括它周围的内容:

preg_match('/(?<=visaObs\()\d+(?=\))/', $attribute, $match);
var_dump($match);
iaqfqrcu

iaqfqrcu5#

您不必使用regex或preg_ function来扫描这种可预测格式的文本。sscanf()甚至可以将子字符串转换为整数作为其提取过程的一部分。不需要转义括号,也不需要匹配数组。
代码:(Demo

$str = 'visaObs(31124228);';
sscanf($str, 'visaObs(%d)', $integer);
var_export($integer);  // 31124228

相关问题