Avatar billede kentora Nybegynder
27. oktober 2010 - 12:58 Der er 34 kommentarer og
1 løsning

Preg_match pattern

<?

//Get file contents
$text = file_get_contents('curl.txt') or die('error reading file');
//echo nl2br(htmlspecialchars($text));

//Date and time setup
    $date = date("j/n-o");
    $hour = date("G");
    $min = date("i");

//prepare for loop
    $results = 0;

while($results == 0){

    //Look for this pattern in the string
    $pattern = '/title="'.$date.' '.$hour.':(.*?)>/';

    echo $pattern;

    //Perfom the preg_match
    preg_match($pattern, $text, $matches);

    //print the array
    print_r($matches);

    //just for now, add 1 to $results, to prevent loop
    $results++;
}

?>

Melder ingenting.

Jeg har lokaliseret til, ikke overraskende, at være i mit pattern. Hvad skal den omformuleres til? Det er første gang jeg arbejder med preg_match...
Avatar billede majbom Novice
27. oktober 2010 - 13:18 #1
det kommer jo helt an på hvad du skal finde i filen...
Avatar billede kentora Nybegynder
27. oktober 2010 - 13:22 #2
title="'.$date.' '.$hour.':(.*?)">

Den skulle gerne finde den fulde titel, hvor title = f.eks 27/10-2010 8:** osv.
Avatar billede majbom Novice
27. oktober 2010 - 13:28 #3
har du prøvet at udskrive $pattern, for at se om den skriver variablerne korrekt?
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 13:29 #4
Noget i stilen af det her?

/title\s*?=\s*?\d{2}\/\s{2}\-\d{4}\s\d{1,2}\:\d{1,2}/
Avatar billede kentora Nybegynder
27. oktober 2010 - 13:32 #5
Jeg ved ikke helt præcis hvordan variablen skal se ud, det er det der er mit problem.

Jannick, det skal jo være med de data jeg har sat tidligere?
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 13:35 #6
Tror jeg skal have en forklaring på hvad det egentligt er du gerne vil matche for det kan jeg godt nok ikke se ud fra din kode :)
Avatar billede kentora Nybegynder
27. oktober 2010 - 13:38 #7
Jeg har gennem cURL hentet kildekoden fra en side. Jeg vil nu gerne hente titlen hvor titlen starter med f.eks. 27/10-2010 8:
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 13:45 #8
- Titlen på hvad?

- Skal den matche alle datoer med det format uanset datoen og tidspunktet eller hvor du specificerer dato og tidspunkt?

- Hvorfor har du overhovedet en while løkke wrappet om din preg_match, eftersom koden i den kun bliver ekserkveret én gang da result er lig med 0 før løkken, og løkken skal køre så længe result er lig med 0 men result jo allerede bliver lig med 1 efter første ekserkvering hvor løkken så stopper.
Avatar billede kentora Nybegynder
27. oktober 2010 - 13:53 #9
- title er på et anchor tag, men det mener jeg er underordnet

- Den skal matche det dato og tidspunkt jeg angiver, ellers ville jeg nok ikke sætte værdierne, og så bruge dem :)

- Det er til videre udvikling.
Avatar billede majbom Novice
27. oktober 2010 - 13:54 #10
variablen pattern skulle gerne se ud som:

title="27/10-2010 13:(.*?)">

sådan ca...

og den matcher så en streng der ser f.eks. således ud:

title="27/10-2010 13:55">

så hvis din streng i filen ikke ser sådan ud, giver det mening, at du ikke får det forventede resultat :)
Avatar billede majbom Novice
27. oktober 2010 - 13:56 #11
og ja, der kan selvfølgelig stå alverden mellem 13: og ">
Avatar billede kentora Nybegynder
27. oktober 2010 - 13:58 #12
Pattern ser sådan der ud.

Og titlen ser sådan der ud, dog bare med noget mere mellem 55 og "
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:04 #13
Prøv den her

/title\=".$date."\s".$hour."\:\d{1,2}\s*?.*?[^\<]\"\>/
Avatar billede majbom Novice
27. oktober 2010 - 14:08 #14
jeg tror at problemet er at du har en skråstreg i din dato - denne skal escapes med en backslash, når du bruger den i dit pattern.

du kan jo lige prøve at lave datoen som denne streng for test:

27\/10-2010

og se om det hjælper...
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:12 #15
Kom jeg også lige i tanke om, men det er ikke kun skråstreg, det er alle specialtegn, også bindestregen mellem måned og år.
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:13 #16
Warning: preg_match(): Unknown modifier '1' in /customers/kentora.dk/kentora.dk/httpd.www/curl/regexp.php on line 23
Avatar billede majbom Novice
27. oktober 2010 - 14:14 #17
bindestregen driller ikke...

men skråstregen får 1-tallet i 10 til at fremstå som en parameter i pattern'et og det er det ikke...
Avatar billede majbom Novice
27. oktober 2010 - 14:14 #18
og hvordan se dit pattern ud nu, når du udskriver det?
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:18 #19
Efter at have sat $date til strengen 27\/10-2010, istedet for date("j\/n-o"), så siger den array().

Hvordan får jeg det nu gjort dynamisk?
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:18 #20
<?
$text = file_get_contents('curl.txt') or die('error reading file');
//echo nl2br(htmlspecialchars($text));

$date = date("j/n-o");
$day = date("j");
$month = date("n");
$year = date("o");
$hour = date("G");
$min = date("i");

$results = 0;

while($results == 0){

$pattern = "/title=" . $day . "\/" . $month . "-" . $year . "\s" . $hour . ":\d{1,2}\s*?.*?[^<]\"\>/";
echo $pattern;
preg_match($pattern, $text, $matches);
print_r($matches);
$results++;
}
?>
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:24 #21
Nu kommer den igen med array(), men har sat hour til 8, og her skulle den altså gerne komme med et resultat. Titlen den gerne skulle komme frem med er:

title="25/10-2010 08:15 til 9:45
Hold: 3g Id...">
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:26 #22
hov, ikke den der..

title="27/10-2010 08:15 til 9:45
Hold: 3g e&#248;.. ">
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:28 #23
Den skulle også gerne komme med et tomt array eftersom den ikke finder nogle resultater.

Men prøv med
$pattern = "/title=\"" . $day . "\/" . $month . "-" . $year . "\s" . $hour . ":\d{1,2}\"\s*?.*?[^<]>/";
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:32 #24
Mit pattern er nu:
/title="27\/10-2010\s8:\d{1,2}"\s*?.*?[^<]>/

Jeg får stadig en tom array.
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:34 #25
Den her skulle meget gerne virke, er først gået op for mig nu at der godt må stå noget efter tidspunktet hvilket ovenstående pattern ikke tillader.

Den her skulle gerne fungere
$pattern = "/title=\"" . $day . "\/" . $month . "-" . $year . "\s" . $hour . ":\d{1,2}.*?\".*?[^<]>/";
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:37 #26
Men jeg har også lige lagt mærke til at den streng du gerne vil matche har 0 foran tidspunktet og det tillader ovenstående pattern heller ikke.
Avatar billede kentora Nybegynder
27. oktober 2010 - 14:37 #27
Hmm.. stadig tom. Sjal der sættes noget ind for at der skal være mellemrum mellem år og timer?
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 14:42 #28
Prøv nu

$day = date("d");
$month = date("m");
$year = date("Y");
$hour = date("H");
$min = date("i");
Avatar billede kentora Nybegynder
27. oktober 2010 - 15:07 #29
Når jeg echoer pattern og kører preg_match, siger den:

/title="27\/10-2010\s15:\d{1,2}.*?".*?[^<]>/Array ( )
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 15:34 #30
Nu virker det, har selv testet og du kan jo selv tjekke/teste min kode

<div style="font-family: verdana; font-size: 12px;">
<?php
    $day = date("d");
    $month = date("m");
    $year = date("Y");
    $hour = date("H");
    $min = date("i");

    $text = "title=\"" . $day . "/" . $month . "-" . $year . " " . $hour . ":15 til 9:45
    Hold: 3g e&\#248;.. \">";

    $pattern = "/title=\"" . $day . "\/" . $month . "\-" . $year . "\s" . $hour . ":\d{1,2}(\s*?.*?\s*?.*?)\">/i";

    echo $pattern . "<br /><br />";

    if (preg_match_all($pattern, $text, $matches, PREG_OFFSET_CAPTURE)) {
        echo "True<br /><br />";
    }
    else {
        echo "False<br /><br />";
    }
   
    print_r($matches);
?>
</div>
Avatar billede kentora Nybegynder
27. oktober 2010 - 15:44 #31
Min kode hedder nu:

<?
//$text = file_get_contents('curl.txt') or die('error reading file');
//echo nl2br(htmlspecialchars($text));

$text = '.91em; left:0.55em;width:9.09em;height:5.73em;word-wrap:break-word;" title="27/10-2010 08:15 til 9:45

Hold: 3g e&#248..';



$day = date("d");
$month = date("m");
$year = date("Y");
//$hour = date("H");
$hour = "08";
$min = date("i");

$results = 0;

while($results == 0){

$pattern = "/title=\"" . $day . "\/" . $month . "\-" . $year . "\s" . $hour . ":\d{1,2}(\s*?.*?\s*?.*?)\">/i";
echo $pattern;
preg_match($pattern, $text, $matches, PREG_OFFSET_CAPTURE);
print_r($matches);
$results++;
}
?>

men virker ikke. Den returnerer et tomt array, og det pattern den kommer med hedder:
/title="27\/10\-2010\s08:\d{1,2}(\s*?.*?\s*?.*?)">/i
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 15:52 #32
$text = '.91em; left:0.55em;width:9.09em;height:5.73em;word-wrap:break-word;" title="27/10-2010 08:15 til 9:45

Hold: 3g e&#248..';

Jeg kan ikke finde slut double-quoten for title attributen ud fra det her, prøv og giv mig HTML'en for en "hel match", start tag til slut tag.
Avatar billede jannick281090 Nybegynder
27. oktober 2010 - 15:53 #33
Og forklar mig hvilken del af title attributen's værdi du gerne vil have pillet ud derfra.
Avatar billede kentora Nybegynder
27. oktober 2010 - 17:08 #34
Arh. Du har ret, jeg havde glemt at slutte title og tag af. Nu virker det! Mange tak :) Du får point! :D
Avatar billede majbom Novice
27. oktober 2010 - 18:33 #35
selv tak...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Vi tilbyder markedets bedste kurser inden for webudvikling

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester