Php 删除前后的字符

Php 删除前后的字符,php,regex,substr,strstr,Php,Regex,Substr,Strstr,这里,我使用strstrstr删除后面的字符,并使用substr删除前面的字符。但是如何一次删除前后的所有字符呢 我只需要从这个变量$mrk='Science-80_-John'中获取80,忽略Science和John 我在做什么 $mrk = 'Science-80_John'; $mark = substr($mrk,strpos($mrk,'-')+1); //output: 80_John echo strstr($mark, '_', true); //output: 80 任何

这里,我使用
strstrstr
删除后面的字符,并使用
substr
删除前面的字符。但是如何一次删除前后的所有字符呢

我只需要从这个变量
$mrk='Science-80_-John'
中获取
80
,忽略
Science
John

我在做什么

$mrk = 'Science-80_John';

$mark = substr($mrk,strpos($mrk,'-')+1);
//output: 80_John

echo strstr($mark, '_', true);
//output: 80

任何其他简短或最佳方式?

您可以在
preg\u replace()
中使用正则表达式并删除添加非数字字符

$mrk = 'Science-80_John';
$newStr = preg_replace("/\D+/", "", $mrk);
// 80

您可以在
preg\u replace()
中使用正则表达式,并删除和添加非数字字符

$mrk = 'Science-80_John';
$newStr = preg_replace("/\D+/", "", $mrk);
// 80
因为op要求一个简短或最好的方法。使用强制转换,字符串中的数字\u可能会执行得更好。忽略
减号
(在本例中可能是连字符),我们得到一个正整数

>>> $mrk = 'Science-80_John';
=> "Science-80_John"
>>> $num = (int)strpbrk ($mrk, "0123456789");
=> 80
上面的用例假设,除了只提取一个正整数之外,
科学记数法
是可以的。约翰决定做一个聪明的小伙子,把他的签名改成一个很大的数字。我们必须决定在什么情况下系统应该接受或拒绝科学记数法

>>> $mrk = 'Science-80E+21_John45';
>>> $num = (int)strpbrk ($mrk, "0123456789");
=> 9223372036854775807 // ack!

>>> $pat = "0123456789";
>>> $num = strpbrk ($mrk, $pat);
>>> $num = substr($num,0 ,strspn($num, $pat));
=>  "80"
由于新的返回值由数字组成,我们不再严格地需要强制转换,因为PHP的。如果根本没有数字,此解决方案将返回空字符串,
,如果在以后的计算中使用该字符串,将生成错误。强制转换到
(int)
将自动返回
0
,但不会告诉我们数据库是否需要更正。在这种情况下,哪种方法更有效?另一个设计决策

字符串函数还可以避免正则表达式在某些解决方案中可能出现的陷阱。如果$str中有一个额外的“45”,会发生什么?结果,
8045
可能并不理想

>>> $mrk = 'Science-80_John45';
=> "Science-80_John45"
>>> $newStr = preg_replace("/\D+/", "", $mrk);
=> "8045"
因为op要求一个简短或最好的方法。使用强制转换,字符串中的数字\u可能会执行得更好。忽略
减号
(在本例中可能是连字符),我们得到一个正整数

>>> $mrk = 'Science-80_John';
=> "Science-80_John"
>>> $num = (int)strpbrk ($mrk, "0123456789");
=> 80
上面的用例假设,除了只提取一个正整数之外,
科学记数法
是可以的。约翰决定做一个聪明的小伙子,把他的签名改成一个很大的数字。我们必须决定在什么情况下系统应该接受或拒绝科学记数法

>>> $mrk = 'Science-80E+21_John45';
>>> $num = (int)strpbrk ($mrk, "0123456789");
=> 9223372036854775807 // ack!

>>> $pat = "0123456789";
>>> $num = strpbrk ($mrk, $pat);
>>> $num = substr($num,0 ,strspn($num, $pat));
=>  "80"
由于新的返回值由数字组成,我们不再严格地需要强制转换,因为PHP的。如果根本没有数字,此解决方案将返回空字符串,
,如果在以后的计算中使用该字符串,将生成错误。强制转换到
(int)
将自动返回
0
,但不会告诉我们数据库是否需要更正。在这种情况下,哪种方法更有效?另一个设计决策

字符串函数还可以避免正则表达式在某些解决方案中可能出现的陷阱。如果$str中有一个额外的“45”,会发生什么?结果,
8045
可能并不理想

>>> $mrk = 'Science-80_John45';
=> "Science-80_John45"
>>> $newStr = preg_replace("/\D+/", "", $mrk);
=> "8045"

这是一个复制品这是一个复制品关于性能。最好使用正则表达式还是使用前面的方法
substr
strstr
。你能分享这个想法吗?在这种情况下,使用字符串函数比正则表达式更好。检查性能如何。最好使用正则表达式还是使用前面的方法
substr
strstr
。你能分享这个想法吗?在这种情况下,使用字符串函数比正则表达式更好。检查好了!比正则表达式好!!请注意,如果稍后有人查看此答案并需要负数,他们必须将
-
字符添加到
strpbrk
模式中。在这里,这是行不通的,因为没有简单的方法来区分减号和连字符。我们下次再谈。太好了!比正则表达式好!!请注意,如果稍后有人查看此答案并需要负数,他们必须将
-
字符添加到
strpbrk
模式中。在这里,这是行不通的,因为没有简单的方法来区分减号和连字符。我们下次再谈。