webForumDet fria alternativet

Problem med mellanslag och PHP

Webbutveckling

6 svar · 642 visningar · startad av renholm

Medlem sedan apr. 20012 266 inlägg
Frågan#1

Försöker få ut ett ord ur en mening med PHP men har problem att få det snyggt.
Meningen är:

du till tåg mot

Har försökt med följande expression

/till (.+) mot/

Vilket inte fungerar, däremot fungerar

/till(.+)mot/

Är detta det bästa sättet att få ut ordet "tåg" ur meningen?

Medlem sedan juli 20011 084 inlägg
#2

Kan det inte vara för att .+ matchar alla tecken, även mellanslag. Och tar därför med mellanslaget efter "tåg ". Om det bara är ett ord du vill ta ut kan du inte använda "till (\w+) mot"

Medlem sedan apr. 20012 266 inlägg
#3

(\w+) fungerar inte heller, får inga träffs alls. För så fort man gör ett mellanslag så verkar det bli problem i regexpen.

Medlem sedan dec. 20025 483 inlägg
#4

Det borde fungera. Hur ser PHP-koden ut?

Medlem sedan apr. 20012 266 inlägg
#5

Har denna testkod och där fungerar allt perfekt:

$str = "Ta buss 1337 från";
preg_match("/(Ta|till) (.+) från/", $str, $matches);

$str2 = "Den går från En station 19:23 och kommer till En hållplats ca 19:30";
preg_match("/från (\D+) (\d{2}:\d{2}) .* till (\D+) (\d{2}:\d{2})/", $str2, $matches2);

print_r($matches);
print_r($matches2);

print "\n";
print $matches2[2] . " " . $matches2[1] . "\t" . $matches[2] . "\n";
print $matches2[4] . " " . $matches2[3] . "\n";

Dock hämtar jag dokumentet jag vill parsa från webben och tror att det kanske blir något knas med encoding där, för koden som inte fungerar ser ut så här:

$dom = new DomDocument;
$dom->loadHTMLFile("http://reseplanerare.sl.se/bin/query.exe/sox?n=1&i=" . $_GET['i'] . "&co=C0-" . $_GET['c'] . "&vca");
$xp = new domxpath($dom);
$result = $xp->query("/html/body[1]/div[2]/div[1]/p[position()<last()]");

foreach($result as $r) {
	$parts = explode(".", $r->nodeValue);

	preg_match("/(Ta|till) (.+) från/", $parts[0], $matches);
	preg_match("/från (\D+) (\d{2}:\d{2}) .* till (\D+) (\d{2}:\d{2})/", $parts[1], $matches2);
	
	print_r($matches);
	print_r($matches2);
	
	print "\n";
	print $matches2[2] . " " . $matches2[1] . "\t" . $matches[2] . "\n";
	print $matches2[4] . " " . $matches2[3] . "\n";
}

Servern svarar i iso-8859-1 och det används även påp webbsidan som output.

Medlem sedan aug. 2002224 inlägg
#6

Ifall du vill plocka allt innan ett specifikt tecken eller gäng tecken så brukar följande funka rätt bra.

/(Ta|till) ([^\s]+)/
Medlem sedan apr. 20012 266 inlägg
#7

Gagzi mjo, har kört det på lite andra ställen.

Problemet är löst nu, berodde på att vissa mellanslag inte var vanliga utan \160 vilket skapade problem när man anger \32 mellanslagen.

272 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
127 ms — deklarationer (db)
0 ms — hämta statistik (cache)
140 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)