Versio

preg match

Overzicht Reageren

Martin Essink

Martin Essink

24/05/2010 15:24:14
Quote Anchor link
ik ben een ondertitel vertaal script aan het maken, maar iets wil niet lukken:
ik wil contoleren of een lijn zoals deze is:
00:00:12,108 --> 00:00:14,793
dmv:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
<?php
if(!empty(preg_match("(.*)-->(.*)",$lines))){
echo "ja";
}
else{
echo "nee";
}

?>

maar dat geeft
Fatal error: Can't use function return value in write context in /home/a2238742/public_html/test/trans.php on line 8(r2 hier)
 
PHP hulp

PHP hulp

25/05/2012 11:35:06
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Karl Karl

Karl Karl

24/05/2010 15:29:38
Quote Anchor link
empty.
Je regex is overigs best wel heel erg ruim, hij klopt niet eens. En dit had je zelf toch ook kunnen vinden?
Gewijzigd op 24/05/2010 15:36:22 door Karl Karl
 
Bas Kreleger
Beheerder

Bas Kreleger

24/05/2010 15:31:45
Quote Anchor link
Je gebruikt de functie verkeerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
preg_match("(.*)-->(.*)", $lines, $matches);
?>


$matches[0] is dan 00:00:12,108
$matches[1] is dan 00:00:14,793

Maar wat wil je precies doen?
 
Karl Karl

Karl Karl

24/05/2010 15:38:52
Quote Anchor link
Bas:
Je gebruikt de functie verkeerd:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
preg_match("(.*)-->(.*)", $lines, $matches);
?>


$matches[0] is dan 00:00:12,108
$matches[1] is dan 00:00:14,793

Maar wat wil je precies doen?


Kijk eens op php.net: preg_match.
php.net:
int preg_match ( string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]] )

Return Values

preg_match() returns the number of times pattern matches. That will be either 0 times (no match) or 1 time because preg_match() will stop searching after the first match. preg_match_all() on the contrary will continue until it reaches the end of subject. preg_match() returns FALSE if an error occurred.

Hij gebruikt de functie niet verkeerd. Als je alleen maar wilt kijken of een string klopt volgens de regex hoef je dus geen matches op te geven.
 
Martin Essink

Martin Essink

24/05/2010 15:38:59
Quote Anchor link
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<?php
$lol
= file('24.S08E21.HDTV.XviD-LOL.srt');
foreach($lol as $lines) {
preg_match("(.*)-->(.*)", $lines, $matches);

  if($lines !== "\r\n"){
    if(is_numeric(substr($lines,0,-2))){
        echo "<h2>".substr($lines,0,-2)."</h2>\n";
        $nr = $lines;
    }
elseif(!empty($matches){
        echo "tyd";
    }
  }
}

?>

een ondertitel translate script maken.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
preg_match("(.*)-->(.*)", $lines, $matches);
?>

geeft
Warning: preg_match() [function.preg-match]: Unknown modifier '-' in /home/a2238742/public_html/test/trans.php on line 4
Gewijzigd op 24/05/2010 15:43:30 door Martin Essink
 
Karl Karl

Karl Karl

24/05/2010 15:44:16
Quote Anchor link
Ja, je regex is verkeerd.
Als je iets wilt gebruiken zal je het eerst moeten leren.
Als je niet weet hoe je moet zwemmen, dan kan je ook niet zwemmen.
Eerst leren dus.
Dat stukje code hierboven slaat ook nergens op.
 
Jelmer rrrr

Jelmer rrrr

24/05/2010 16:23:22
Quote Anchor link
Hoe precies wil je bepalen dat die regel aan dat formaat voldoet? Bijvoorbeeld heel strikt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
^\d{2}:\d{2}:\d{2},\d{3}\s+-->\s+\d{2}:\d{2}:\d{2},\d{3}$
.
^ is het begin van een lijn
$ het einde van een lijn
\d een getal van 0 tot 9
{2} twee maal het ding ervoor (\d, getal tussen 0 en 9) matchen
\s spatie of tab
+ ding wat ervoor staat (spatie, tab) één of meer keer matchen

Combineer dat met preg_match:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
<?php
$fhandle
= fopen('iets.srt', 'r');

while(!feof($fhandle)) {
    $line = fgets($fhandle);
    
    if(preg_match('{^\d{2}:\d{2}:\d{2},\d{3}\s+-->\s+\d{2}:\d{2}:\d{2},\d{3}$}', $line)) {
        echo 'tijd';
    }
}

?>

Maar de vraag is nog steeds: wat wil je precies?
Gewijzigd op 24/05/2010 16:23:56 door Jelmer rrrr
 
Willem Jan Z

Willem Jan Z

24/05/2010 16:32:24
Quote Anchor link
Jelmer, voorpieper :P Had net het volgende geschreven:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
<?php
    $lines
= array(
        '00:00:12,108 --> 00:00:14,793',
        '01:12:42,318 --> 01:12:18,593',
    );

    
    foreach ($lines as $line) {
        if (preg_match('/^([\d]{2}):([\d]{2}):([\d]{2}),([\d]+)\s(\-\->)\s([\d]{2}):([\d]{2}):([\d]{2}),([\d]+)$/', trim($line), $matches)) {
            var_dump($matches);
        }
    }

?>

Jouw voorbeeld is qua file-handling wel uitgebreider :)

edit: Wel weer wat geleerd, dacht dat {} niet zonder een groep of range ervoor kon, blijkbaar wel :)
edit2: Nog een wijziging, klopte iets niet in mijn groeperingen
Gewijzigd op 24/05/2010 16:39:23 door Willem Jan Z
 
Martin Essink

Martin Essink

24/05/2010 17:02:21
Quote Anchor link
of:
}elseif(substr($lines,13,3) == "-->"){
 
Karl Karl

Karl Karl

24/05/2010 17:16:58
Quote Anchor link
Martin:
of:
}elseif(substr($lines,13,3) == "-->"){


Waarvoor zou je dat doen als je toch al met regular expressions bezig bent?
 
Willem Jan Z

Willem Jan Z

24/05/2010 17:17:17
Quote Anchor link
Als je 100% weet dat --> altijd op dezelfde plek staat kan dat, maar je controleert nu totaal niet of er tijden staan.

Als ik me niet vergis is strpos stuk sneller dan substr e.a.
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
}elseif(strpos($lines, '-->) === 13){
 
Richard van Velzen

Richard van Velzen

24/05/2010 17:19:11
Quote Anchor link
Natuurlijk niet de m-modifier vergeten als je per regel wil matchen met ^ en $.
 
Jelmer rrrr

Jelmer rrrr

24/05/2010 17:54:29
Quote Anchor link
Richard:
Natuurlijk niet de m-modifier vergeten als je per regel wil matchen met ^ en $.

niet noodzakelijk, aangezien ik er maar één regel per keer in gooi.


Martin:
of:
}elseif(substr($lines,13,3) == "-->"){

Gevaar hiervan is dat het ook matcht wanneer --> in de subtitels zelf staat. Maar dat argument kan je ook gebruiken tegen de preg_match oplossing. Eigenlijk moet je gewoon tellen wat je nu op de regel verwacht. Begin van bestand: subtitel-index. Vorige regel subtitelindex? Dan moet dit de tijd zijn. Vorige regel de tijd? Dan moet dit de subtitel zelf zijn. Witte regel? dan komt hierna weer een index.
 
Martin Essink

Martin Essink

24/05/2010 18:37:08
Quote Anchor link
ik heb het nu zo:
http://test.seriez.co.cc/trans.php?begin=0&end=2500
Gewijzigd op 24/05/2010 18:51:55 door Martin Essink
 
Richard van Velzen

Richard van Velzen

25/05/2010 15:53:05
Quote Anchor link
Jelmer:
Richard:
Natuurlijk niet de m-modifier vergeten als je per regel wil matchen met ^ en $.

niet noodzakelijk, aangezien ik er maar één regel per keer in gooi.

Nou dan, wat is het nut van een regel per keer? Niks, noppes, nada, het is alleen inefficiënt.
 



Overzicht Reageren

Get Adobe Flash player