2016-09-03 2 views
1

Im folgenden Snippet gibt pre_match den ersten Breitengrad gefolgt von sehr vielen Zeichen zurück, dann den Längengrad.
Was ich bin, ist das endgültige Längen-/Breitenpaar.
Wie beschränke ich den Abstand zwischen den beiden Lesungen auf maximal 4 Zeichen?
Der Ausdruck .*? erlaubt zu viele Zeichen.
Wie kann ich dies ändern, um eine kleinere Anzahl zu erlauben?Wie beschränke ich die Anzahl der Zeichen in einer Wildcard-Übereinstimmung in einem Preg_Match-Muster?

<?php 
$lcline="tuesday, 20th. light airs and clear weather. p.m. started at latitude 24 degrees 12 minutes took several azimuth, which gave the variation 16 degrees 30 minutes west. put the ship's company to three watches. wind variable; course south 21 degrees 30 minutes west; distance 28 miles; latitude 31 degrees 17 minutes, longitude 17 degrees 19 minutes west; at noon, funchall, island of madeira, north 13 degrees east, 76 miles. "; 

preg_match('/(latitude\s+\d+\s+degrees\s+\d+\s+minutes.*?longitude\s+\d+\s+degrees\s+\d+\s+minutes)/', $lcline, $results); 
echo "results=".$results[0]."<BR><BR>" 
?> 

Antwort

0

Expression

Fun ction

{n}

Spiel genau n-mal, Beispiel: Klicken Sie zu testen "\ w {2}" gleich "\ w \ w"; Klicken Sie testen "a {5}" gleich "aaaaa"

{m, n}

Mindestens m aber nicht mehr als n-mal: Klicken Sie, um zu testen "ba {1,3}" entspricht "ba", "Baa", "baaa"

{m,}

Spiel mindestens n-mal: Click to test "\ w \ d {2}" entspricht "a12", "_ 456 "," M12344 "...

?

1 oder 0 Mal entsprechen, entspricht {0,1}: Klicken Sie hier, um "a [cd]?" entspricht "a", "ac", "ad".

  • Match 1 oder mehrmals, das entspricht {1,}: Klicken Sie auf "a + b" passt "ab", "aab", "aaab" zu testen ...

Spiel 0 oder mehrmals, das entspricht {0,}: Klicken Sie auf "\^* b" matches "b", "^^^ b" zu testen ...

Referenz : http://www.regexlab.com/en/regref.htm

+1

dies löst es. Ändern .*? zu.{1,4} begrenzt die Lücke zwischen den Längen- und Breitenangaben – user2016210

+0

. Wenn ich jedoch eine Textdatei des Captain Cook Logs durchfalle, die Zeilen einzeln nacheinander extrahiere, kann ich dieses preg_match nicht finden, um Übereinstimmungen in jeder Zeile zu finden - - obwohl es Hunderte gibt! – user2016210

1

hinzufügen .+ am Anfang der Regex und erhalten das Ergebnis aus der Gruppe 1:

preg_match('/.+(latitude\s+\d+\s+degrees\s+\d+\s+minutes.*?longitude\s+\d+\s+degrees\s+\d+\s+minutes)/s', $lcline, $results); 
echo "results=",$results[1],"\n"; 

Ausgang:

results=latitude 31 degrees 17 minutes, longitude 17 degrees 19 minutes 
0

Wenn u Grenze sagen, können Sie geschweiften Klammern verwenden zB: /\s{4}/ dies alles mit 4 Leerzeichen wählen nacheinander

+0

Diese Antwort ist nah an einer Lösung, aber es beantwortet nicht, wie man eine variierende Anzahl von zufälligen Zeichen zwischen den Einträgen findet – user2016210

Verwandte Themen