我无法理解正则表达式,任何帮助表示赞赏!
我有很多字符串数据,可能包含也可能不包含字符串“1/10”或“2/10”或“2/18”等。基本上,分子和分母都可能有所不同。为了使事情变得更复杂,一些数据输入操作员可能在分子和分母之间放置了一个空格! 所以我的意见可能是: “x / y”或“x / y”或“x / y”或“x / y”或“x / y”......以及可能更多的组合:(
在任何这些情况下,我希望确定x和y是否为数字,以及它们之间是否有“/”斜杠。在正则表达式上绝望,请帮助
我在php编码,我想preg_match是需要使用的。 谢谢你的阅读。
答案 0 :(得分:4)
$pattern = "%(\d+) */ *(\d+)%";
$test = array(
'half is 1/2',
'13/100 is your score',
'only 23 /90 passed',
'no idea here:7/ 123',
'24 / 25',
'1a/2b'
);
foreach($test as $t){
if(preg_match($pattern, $t, $matches))
echo "PASS: n:$matches[1], d:$matches[2]\n";
else
echo "FAIL: $t\n";
}
输出:
PASS: n:1, d:2
PASS: n:13, d:100
PASS: n:23, d:90
PASS: n:7, d:123
PASS: n:24, d:25
FAIL: 1a/2b
答案 1 :(得分:1)
if(preg_match('~^[0-9]+\s*/\s*[0-9]+$~',trim($subject))) {
// valid
}
答案 2 :(得分:0)
if(preg_match('@^\s?[0-9]+\s?\/\s?[0-9]+\s?$@', $s) {
...
}
答案 3 :(得分:0)
我认为你应该不惜一切代价避免使用regexp。您应该(可能)的几个案例:
否则我的建议是不要使用它!
在任何这些情况下,我希望 确定x和y是否是数字,和 如果它们之间有“/”斜杠。 在正则表达式上绝望,请帮助
如何解决您的问题:
<?php
class Verify {
public static function numbers($str) {
$explode = explode("/", $str);
foreach($explode as $elm) {
if (!filter_var($elm, FILTER_VALIDATE_INT)) {
return false;
}
}
return true;
}
}
class StackTest extends PHPUnit_Framework_TestCase {
public function testBothPartsAreNumbers() {
$array = array(
"1/2",
"1 / 2",
"1/ 2",
"1 /2"
);
foreach($array as $elm) {
$this->assertTrue(Verify::numbers($elm));
}
}
public function testOneOfThemMightBeNotANumber() {
$array = array(
"1/a",
"a/1",
"1 / a",
"b/2",
"b/a",
"1/2.1",
);
foreach($array as $elm) {
$this->assertFalse(Verify::numbers($elm));
}
}
}
?>
alfred@alfred-laptop:~/php/stackoverflow/4916920$ php -v
PHP 5.3.3-1ubuntu9.3 with Suhosin-Patch (cli) (built: Jan 12 2011 16:08:14)
Copyright (c) 1997-2009 The PHP Group
Zend Engine v2.3.0, Copyright (c) 1998-2010 Zend Technologies
with Xdebug v2.1.0, Copyright (c) 2002-2010, by Derick Rethans
# We need at least PHP5.2 for filter.
alfred@alfred-laptop:~/php/stackoverflow/4916920$ phpunit NumberTest.php
PHPUnit 3.5.10 by Sebastian Bergmann.
..
Time: 0 seconds, Memory: 3.50Mb
OK (2 tests, 10 assertions)