webForumDet fria alternativet

regexp hell!

10 svar · 365 visningar · startad av Matti

MattiMedlem sedan dec. 19993 781 inlägg
#1

Hej

Jag har variabeln $body som innehåller ett inläst HTML-dokument. I det inlästa HTML-dokumentet finns strängar som {body}, {title}, {navigation}, {footer} osv. Jag vill plocka ut dessa strängar och slänga in dem i en variabel/array av något slag. Har lekt runt lite med reguljära uttryck men inte lyckats åstadkomma något vettigt.

Hjälp?

nicclasMedlem sedan feb. 20001 061 inlägg
#2

Kan du visa ett litet exempel på html-fil och hur du vill ersätta?

MattiMedlem sedan dec. 19993 781 inlägg
#3

html-filen är en template

<html>
<head>
<title>{title}</title>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
</head>

<body bgcolor="#FFFFFF" text="#000000">
<table width="750" border="0" cellspacing="3" cellpadding="3">
  <tr>
    <td width="150" align="left" valign="top"> 
      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="5"><b>{logo}</b></font></p>
      <p>&nbsp;</p>
      <p><a href="../msystem/skrivindata.php">l&auml;gg till sida</a><br>
        <a href="../msystem/andradata.php">&auml;ndra data</a><br>
        navlink3<br>
        navlink4<br>
        navlink5 </p>
      <p>&nbsp;</p>
      <p><font face="Verdana, Arial, Helvetica, sans-serif" size="4"><b>Ads:</b></font></p>
      <p>{ads}</p>
      </td>
    <td align="left" valign="top">{content}</td>
  </tr>
</table>
</body>
</html>

Jag vill plocka ut "title", "logo", "ads" och "content" och placera dessa i en variabel så att jag kan lagra dem i en databas.

Möjligt?

SPiNMedlem sedan mars 20005 832 inlägg
#4

Klart att det är möjligt!

<?php
...
preg_match ( "{[a-z]}", $body, $arrMatches );
for ( $i = 1; $i < count ( $arrMatches ); $i++ ) {
    // Stoppa in $arrMatches[ $i ] i databasen
}
...
?>

Det reguljära uttrycket tillåter endast stora och små bokstäver från det engelska alfabetet mellan de två "bracketchar'sen" ( { och } ). Resultatet hamnar i arrayen $arrMatches, och loopen börjar på 1, etftersom att $arrMatches[ 0 ] innehåller hela strängen och inget resultat.

MattiMedlem sedan dec. 19993 781 inlägg
#5

Hej,
tack för svaret.

När jag testkörde följande skript skrevs ingenting ut på sidan

<?php
$body = "sample text {with} some nice {template} elements and lots of {brackets}";

preg_match ( "{[a-z]}", $body, $arrMatches );
for ( $i = 1; $i < count ( $arrMatches ); $i++ ) {
	// skriver ut innehållet
    echo $arrMatches[$i];
}

?>

Nu är jag visserligen helt hopplös på loopar men echo $arrMatches[$i]; borde väl skriva ut innehållet i $arrMatches? Vad har jag missat?

SPiNMedlem sedan mars 20005 832 inlägg
#6

Ja, det borde det. Jag kom på en sak, så här borde mönsret se ut:
preg_match ( "/\{([a-z]{1,})\}/is", $body, $arrMatches );

Vad får du för resultat om du skriver ut storleken på arrayen? ( echo count ( $arrMatches ) ).

MattiMedlem sedan dec. 19993 781 inlägg
#7

echo count ( $arrMatches ); ger siffran 2.

<?php
$body = "sample text {with} some nice {template} elements and lots of {brackets}";
preg_match ( "/\{([a-z]{1,})\}/is", $body, $arrMatches ); 
for ( $i = 1; $i < count ( $arrMatches ); $i++ ) {
    // skriver ut innehållet
    echo $arrMatches[$i]; // <------ skriver ut "with"

}
?>

$arrMatches[0] skriver ut "{with}".

SPiNMedlem sedan mars 20005 832 inlägg
#8

Använd preg_match_all () istället för preg_match (). :)

Red.}
Så här ser scriptet ut alltså: :)

<?php
$body = "sample text {with} some nice {template} elements and lots of {brackets}";
preg_match_all ( "{([a-zA-Z]{1,})}", $body, $arrMatches );
for ( $i = 1; $i < count ( $arrMatches ); $i++ ) {
    // skriver ut innehållet
    echo $arrMatches[ $i ][ 1 ];
}
?>
MattiMedlem sedan dec. 19993 781 inlägg
#9

aaah! :)

Fungerar fortfarande inte. Skriptet som du postade ovan skriver ut "text". Fungerar det hos dig?

nicclasMedlem sedan feb. 20001 061 inlägg
#10

Prova så här ;)

<?php

$body = "sample text {with} some nice {template} elements and lots of {brackets}
";
preg_match_all("/{([a-zA-Z]+)}/mis",$body,$arrMatches);
for ($i=0;$i<=count($arrMatches);$i++) {
    // skriver ut innehållet
    echo $arrMatches[1][$i]."\n";
}

?>

/nicclas - https://www.nyhetsrubriker.com

MattiMedlem sedan dec. 19993 781 inlägg
#11

Hey, där ser man. Nu fungerar det. :)

Tack för hjälpen, Spin och nicclas. :)

Genererad på 372 ms · cache AV · v20260730165559-full.f96bc7eb