我在使用 preg_replace()
从字符串中提取特定字符时遇到了困难。所有字符串都与下面两个示例中显示的一致。
我正在尝试提取数量整数,即。对于第一个示例,我将得到 200
,第二个示例将得到 50
。
示例字符串
$string = '防晒霜 25g(200 份)';
$string = '润滑剂 100ml(50 份)';
正则表达式代码
$product = preg_replace('/(Sunscreen|Lubricant)/i', '', $string);
后跟:
$product = preg_replace('/(\(d*.Quantity\))/i', '$0', $product)
预期结果
从第一个字符串开始:int(200)
第二个字符串:int(50)
如有任何帮助,我们将不胜感激。我无法获取“数量”之前和“(”之后的数字。
最佳答案
您不需要在此任务中抛出多个 preg_
调用,只需匹配整个字符串并仅捕获第一个遇到的 (
后面的数字。替换包含捕获的数字的整个字符串 - 这样就不需要访问临时数组;字符串输入将直接转换为所需的输出字符串。
代码:(Demo)
$strings = [
'Sunscreen 25g (200 Quantity)',
'Lubricant 100ml (50 Quantity)',
'WD-40 100ml (75 Quantity)',
];
foreach ($strings as $string) {
echo preg_replace('~[^(]+\((\d+).*~', '$1', $string) . "\n";
}
输出:
200
50
75
事实上,preg_replace()
可以愉快地处理字符串数组。 (Demo)
var_export(preg_replace('~[^(]+\((\d+).*~', '$1', $strings));
分割:
[^(]+ #match one or more non-left-parenthesis characters
\( #match literal left parenthesis
( #begin capture group 1
\d+ #match one or more digits
) #end capture group 1
.* #match the remainder of the string
或者,如果您想创建一个包含数量数字的数组(这不太直接,因为必须从生成的数组中提取目标字符串),您可以使用 preg_match()
,但绝对没有理由使用 preg_match_all()
。 \K
重新启动完整字符串匹配,因此不需要捕获组。
代码:( Demo ) ...与上面相同的输出
foreach ($strings as $string) {
echo (preg_match('~\(\K\d+~', $string, $match) ? $match[0] : 'no quantity') . "\n";
}
关于php - 如何从字符串中的特定文本和字符获取整数(正则表达式/PHP),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63681638/