在百分号前获取数字

时间:2013-08-14 10:33:54

标签: php regex preg-match

我有一个这样的字符串:

$string = "Half Board, 10% Off & 100 Euro Star - Save £535";

百分比可以是字符串中的任何位置。

这就是我所拥有的,但我不喜欢它有一个preg_replace和一个循环操作的事实,它很重。我想要一个可以在一次操作中完成它的ReGex表达式。

$string = "Half Board, 10% Off & 100 Euro Star - Save £535";
$string_array = explode(" ", $string);
$pattern = '/[^0-9,.]*/'; // non-digits

foreach($string_array as $pc) {

    if(stristr($pc, '%')) {

        $percent = preg_replace($pattern, '', $pc);
        break;
    }
}

echo $percent;
exit;

4 个答案:

答案 0 :(得分:4)

更新:
从您添加到问题中的代码中,我得到的结果是您的百分比可能看起来像12.3%甚至.50%。在这种情况下,你正在寻找的正则表达式是:

if (preg_match_all('/(\d+|\d+[.,]\d{1,2})(?=\s*%)/','some .50% and 5% text with 12.5% random percentages and 123 digits',$matches))
{
    print_r($matches);
}

返回:

Array
(
[0] => Array
    (
        [0] => .50
        [1] => 5
        [2] => 12.5
    )

[1] => Array
    (
        [0] => .50
        [1] => 5
        [2] => 12.5
    )

)

表达解释:

  • (\d+|\d*[.,]\d{1,2}):是一个OR - >匹配数字\d+\d*零个或多个数字,后跟小数点分隔符([.,])和1或2位数字(\d{1,2}
  • (?=\s*%):仅当前面提到的组后跟零个或多个空格且%符号

使用具有正向前瞻性的正则表达式,您可以得到您想要的内容:

if (preg_match_all('/\d+(?=%)/', 'Save 20% if you buy 5 iPhone charches (excluding 9% tax)', $matches))
{
    print_r($matches[0]);
}

给你:

array (
    0 => '20',
    1 => '9'
)

我相信,你在寻找什么 正则表达式的工作原理如下:

  • \d+匹配至少1位数(尽可能多)
  • (?=%):前提是后跟%标志

由于前瞻,我提供的示例中5不匹配,因为它后跟一个空格,而不是%符号。
如果您的字符串可能格式错误(数字和%符号之间有任意数量的空格),前瞻也可以处理。作为回归者指出,只有外观需要固定大小,所以:

preg_match_all('/\d+(?=\s*%)/', $txt, $matches)

前瞻就像这样

  • \s*:匹配零个或多个空白字符
  • %百分号

因此,123 %123%都符合模式,并且会匹配 阅读正则表达式is regular-expressions.info

的好地方

如果“复杂”正则表达式(即带有外观断言)不是你的一杯茶(尽管我强烈建议学习使用它们),你可以诉诸于分裂字符串:

$parts = array_map('trim', explode('%', $string));
$percentages = array();
foreach($parts as $part)
{
    if (preg_match('/\d+$/', $part, $match))
    {//if is required, because the last element of $parts might not end with a number
        $percentages[] = $match[0];
    }
}

在这里,我只是使用%作为分隔符,创建一个数组,并修剪每个字符串部分(以避免尾随空格),然后继续检查每个子字符串,并匹配上面的任何数字。该子字符串的结尾:

'get 15% discount'
['get 15', 'discount']
/\d+$/, 'get 15' = [15]

但这只是一项非常多的工作,使用前瞻更容易。

答案 1 :(得分:2)

$str = "Half Board, 10% Off & 100 Euro Star - Save £535";
preg_match("|\d+|", $str, $arr);
print_r($arr);

答案 2 :(得分:1)

尝试split喜欢

$str_arr = split(' ',$str);
$my_str = split('%',$str_arr[1]);
echo $my_str[0];

答案 3 :(得分:0)

这应该有效:

$str = "Save 20% on iPhone chargers...";
if (preg_match_all('/\d+(?=%)/', $str, $match))
   print_r($match[0]);

现场演示:http://ideone.com/FLKtE9