php - 如何从字符串中的特定文本和字符获取整数(正则表达式/PHP)

标签 php regex

我在使用 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/

相关文章:

php - 有没有办法在 Laravel Dusk 中断言当前 URL 值?

php - 使用 Hook 替换 Woocommerce 商店页面上的图像

regex - 如何在 spring boot 中使用正则表达式输入字段进行验证

regex - Perl QR//和替代

regex - 珀尔 : How to match a parenthesis inside a regexp?

javascript - 是否可以在正则表达式中嵌入代码?

php - 在 PHP 中获取一周的第一天?

php - 如果数据字段为空,$mysqli->prepare 返回 false

php - codeigniter 中未定义的表数据?

正则表达式:前两个字符中至少有一个必须是字母