Page 1 of 1
preg_split problems
Posted: Sun Sep 18, 2005 3:10 pm
by davidjwest
Code: Select all
$line = preg_split("\s[0-9]+\s03\sDavid West\s",$description);
I get this error:
Warning: preg_split(): Delimiter must not be alphanumeric or backslash in /home/qhwslos/public_html/results_entry.php on line 59
I've never used this command before and am new to regexes too, what did I do wrong?
Posted: Sun Sep 18, 2005 3:26 pm
by s.dot
try this:
Code: Select all
$line = preg_split("|s[0-9]+\s03\sDavid West\s|",$description);
You can't use a \ or a-z A-Z 0-9 to contain your regex
Posted: Sun Sep 18, 2005 3:32 pm
by Burrito
Moved to regex
Posted: Sun Sep 18, 2005 3:38 pm
by davidjwest
Thanks, that works, or at least it doesn't give any errors!
My lack of knowledge however means it's not doing what I expected, here's more detail if anyone can spare the time to help, I would be grateful!
I want to extract data from this page:
http://v8lites.teamecosse.org.uk/Autumn ... /Race.html
I was hoping my code would assign just the information covered by my regex, "Pos" is what I after, but it brings back the whole load of data. Am I using the wrong function or is it my regex?
Posted: Sun Sep 18, 2005 4:16 pm
by sweatje
This should give you some ideas. Expressed as a
SimpleTest test case:
Code: Select all
function testParseRaceResults() {
$page = "RACE RESULTS (After 60 laps)
Pos No Driver Laps Race Time Diff Speed Points
1 29 Sarah O'Hallaran 60 50m44.086s 141.915 180
2 31 Marc van Brakel 60 50m44.191s 00.105s 141.910 180
3 77 Matt Screaton 60 50m44.251s 00.165s 141.907 165
4 03 David West 60 50m44.363s 00.277s 141.902 165
5 90 Jacques Richard 60 50m47.406s 03.320s 141.760 155
6 08 Peter Andersson 60 50m52.704s 08.618s 141.514 150
7 04 Scott Dryden 60 50m56.407s 12.321s 141.343 146
8 40 Bruce Duncan 60 51m14.388s 30.302s 140.516 142
9 05 Neil Marlow 59 51m11.893s 1 lap(s) 138.286 143
10 5 John Power 57 50m44.535s 3 lap(s) 134.799 134
11 87 Sharon Owen 57 51m18.429s 3 lap(s) 133.315 130
12 111 brian freeman SPX 41 39m28.969s 18 lap(s) 125.647 127
13 177 Ian Newman 34 30m17.997s 25 lap(s) 132.738 124
14 30 Craig Teasdale 31 31m40.318s 29 lap(s) 117.454 121
15 82 marcus litwinow 17 15m02.164s 43 lap(s) 135.674 118
16 07 Alan Strang 0 DidNotStart 60 lap(s)
17 -1 Pace Car 0 DidNotStart 60 lap(s)
18 86 Simon m Savage 0 DidNotStart 60 lap(s)
19 000 The Player 0 DidNotStart 60 lap(s)
";
$regex = "~ # tilda delimited regex
\n # look for a start of line
\s* # and then possibly some whitespace
(?P<Pos> \b\d+\b) # a capture named 'Pos' (PHP 4.3.3+ only)
\s+
(?P<No> -?\d+\b)
\s+
(?P<Driver> \b[a-z' ]+?(?!>\s{3}))
\s+
(?P<Laps> \b\d+\b)
\s+
(?P<RaceTime> \b(?:\d+m\d+\.\d+s|DidNotStart)\b)
\s+
(?P<Diff> \b(?:\d+\s+[laps()]+|\d+\.\d+s))?
(\s+
(?P<Speed> \b\d+\.\d+)
\s+
(?P<Points> \b\d+))?
# i = case insensitive
# x = extended whitespace parsing (i.e. allow these comments)
# m = multi line
# s = . include new line
~ixms";
preg_match_all($regex, $page, $matches);
$this->assertEqual(19, count($matches['Driver']));
$this->assertEqual(3, $i = array_search('David West', $matches['Driver'] ));
$this->assertEqual(4, $matches['Pos'][$i]);
$this->assertEqual('03', $matches['No'][$i]);
$this->assertEqual(60, $matches['Laps'][$i]);
$this->assertEqual('50m44.363s', $matches['RaceTime'][$i]);
$this->assertEqual('00.277s', $matches['Diff'][$i]);
$this->assertEqual(141.902, $matches['Speed'][$i]);
$this->assertEqual(165, $matches['Points'][$i]);
}