Php 如果字符串中单词后的术语是浮点

Php 如果字符串中单词后的术语是浮点,php,Php,我有一个字符串: $string = 'Hello world Vol. 3.5 ispum 99'; 我想得到术语vol之后的float/int值,因此我最终得到: $value = '3.5'; 到目前为止我都试过了 我能想到的唯一方法是分解(“”,$string)并检查Vol.之后的迭代是否是浮点 是否有不同/更好的方法 原因 我通过RSS随机获取大量文章标题。我的目标是确定每篇文章都与哪一卷相关。每篇文章中的术语“卷”各不相同,因此我们可以有:Vol.,volume,插曲,书等。可能

我有一个字符串:

$string = 'Hello world Vol. 3.5 ispum 99';
我想得到术语
vol
之后的float/int值,因此我最终得到:

$value = '3.5';
到目前为止我都试过了 我能想到的唯一方法是
分解(“”,$string)
并检查
Vol.
之后的迭代是否是浮点

是否有不同/更好的方法

原因
我通过RSS随机获取大量文章标题。我的目标是确定每篇文章都与哪一卷相关。每篇文章中的术语“卷”各不相同,因此我们可以有:
Vol.
volume
插曲
等。

可能并不漂亮,但这是有效的:

$string = 'Hello world Vol. 3.5 ispum';
echo (float) trim(preg_replace("/[^0-9\.]/","", $string), ".");
首先使用
preg\u replace
删除除数字和点以外的所有字符。然后使用
trim()

删除字符串末尾开始处的所有点,这可能会对您有所帮助

$string = 'Hello world Vol. 4.5 ispum 99';
$arry = explode(' ',$string);
$key = array_search('Vol.',$arry)+1; //you can use volume,book etc
$value = floatval($arry[$key]);
if($value && intval($value) != $value)
{
    echo $value." is a float";
}
else
{
    echo $value." is not a float";
}

filter\u var
也在这种情况下工作,用于使用某些指定的过滤条件过滤变量。了解更多

FILTER\u SANITIZE\u NUMBER\u FLOAT
过滤器用于删除浮点数中的所有非法字符,
FILTER\u标志\u ALLOW\u FRACTION
允许分数分隔符,类似于


首先,
filter\u var
过滤字符串,并从字符串中删除除数字和点以外的所有字符。因此,对于给定的字符串,结果应该是这样的
.3.5
,因此如果在过滤后的字符串上添加trim,那么输出应该是这样的
<3.5

,您可以修剪字符串,使其以数字开头 然后PHP可以正确地转换它

$str = 'Hello world Vol. 3.5 ispum'; 
$pos = strpos($str, 'Vol.') + 4; 
$val = (float)substr($str, $pos); 
var_dump($val); 
浮动(3.5)


有关详细信息,请参见文档

您可以使用正则表达式:

$string = 'Hello world Vol. 3.5 ispum 99';
if (preg_match('/(Vol\.|volume|episode)\s*(\d+(\.\d+)?)/i', $string, $matches))
    var_dump($matches[2]);
  • (Vol\.| volume | eposion)
    匹配任何给定单词
  • \s*
    会吃掉任意数量的空格
  • (\d+(\.\d+))
    匹配整数值或浮点值
或者更一般地说:

$terms = ['vol.', 'volume', 'episode'];
$terms_quoted = [];
foreach ($terms as $term)
    $terms_quoted[] = preg_quote($term, '/');

$string = 'Hello world Vol. 3.5 ispum 99';
if (preg_match('/('.implode('|', $terms_quoted).')\s*(\d+(\.\d+)?)/i', $string, $matches))
    var_dump($matches[2]);

有趣。但是如果字符串类似于
$string='Hello 99 world Vol.3.5 ispum',它就会中断您可以使用的所有滴度中都有模式吗?例如,它是否总是包含“vol.”一词?如果不是这样的话,要把它做好将是一项非常困难的任务,它需要机器学习。一个更简单的解决方案可能是让空间保持原样,并通过在空间上分解来驻留到原始解决方案中。至少你知道你只剩下数字了。然后您可以检查数字的值。第3.5卷的猜测比第99卷更好。这是一个非常有趣的猜测,但不适用于
$string='99 Hello world第3.5卷ispum'或类似场景。regex又是什么不区分大小写的方法?@henrikpeterson你是说
i
修饰符
preg_match('/../i',…)
。是的,请添加
i
修饰符。此外,它与
$string='99 Hello world Vol.2.3'不匹配--注意
Vol.
和浮点之间缺少间距。非常好。您输入了
$temrs
,但完全正常。请添加一些解释。
$terms = ['vol.', 'volume', 'episode'];
$terms_quoted = [];
foreach ($terms as $term)
    $terms_quoted[] = preg_quote($term, '/');

$string = 'Hello world Vol. 3.5 ispum 99';
if (preg_match('/('.implode('|', $terms_quoted).')\s*(\d+(\.\d+)?)/i', $string, $matches))
    var_dump($matches[2]);
$title = 'Hello world episode 342 ispum 99';
// Works also for
// $title = 'Hello world Vol. 3.5 ispum 99';
// $title = 'Hello world volume 23.53 ispum 2345';
// $title = 'Hello world book 34532 ispum 4';
$matches = array();
// Check if there is any volume data in our title
foreach(['Vol.', 'volume', 'episode', 'book'] as $term){
    if (strpos($title, $term) !== false) {
        // Bingo! Now take the first int/float after the found term
        preg_match("/(\d+(\.\d+)?)/", explode($term, $title)[1], $matches);
        print_r($matches[0]);
        return;
    }
}