php预赛噩梦
我就是想不通regex,谢谢你的帮助 我有大量的字符串数据,可能包含也可能不包含字符串“1/10”或“2/10”或“2/18”等。基本上,分子和分母都可能不同。为了让事情变得更复杂,一些数据输入操作符可能在分子和分母之间的任何位置都放置了一个空格!! 因此,我的投入可以是: “x/y”或“x/y”或“x/y”或“x/y”或“x/y”。。。。可能还有更多的组合:( 在这些情况下,我想确定x和y是否是数字,它们之间是否有一个“/”斜杠。我在regex没有希望,请帮助 我是用php编码的,我想preg_match是需要使用的。 谢谢你的阅读php预赛噩梦,php,regex,preg-match,Php,Regex,Preg Match,我就是想不通regex,谢谢你的帮助 我有大量的字符串数据,可能包含也可能不包含字符串“1/10”或“2/10”或“2/18”等。基本上,分子和分母都可能不同。为了让事情变得更复杂,一些数据输入操作符可能在分子和分母之间的任何位置都放置了一个空格!! 因此,我的投入可以是: “x/y”或“x/y”或“x/y”或“x/y”或“x/y”。。。。可能还有更多的组合:( 在这些情况下,我想确定x和y是否是数字,它们之间是否有一个“/”斜杠。我在regex没有希望,请帮助 我是用php编码的,我想preg
if(preg_match('~^[0-9]+\s*/\s*[0-9]+$~',trim($subject))) {
// valid
}
产出:
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
我认为您应该不惜任何代价避免使用regexp。有几个案例您应该(可以):
- 您是regexp方面的专家。如果您是,那么您可能应该使用regexp,因为它可能会更快、更简洁。尽管在我看来可读性会很差
- 您需要提高性能
<?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));
}
}
}
?>
查看中列出的一些工具,这些工具可能有助于您开始和设计正则表达式。1.2/4.2也必须匹配吗?没有Hamish,幸运的是我没有分数:)谢谢,这很有效,但前提是我的字符串只包含x/y变量。谢谢,这很有效,但仅当我的字符串只包含x/y变量时。要使其与任何包含x/y变量的字符串匹配,请删除
^
和$
。他们的意思是-分别是弦的开始和结束。太棒了,完美了!这是您给出的一个很酷的测试用例:)
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
<?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)