我有一个这样的字符串:
$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;
答案 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]);