MattiMedlem sedan dec. 19993 781 inlägg
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
Kan du visa ett litet exempel på html-fil och hur du vill ersätta?
MattiMedlem sedan dec. 19993 781 inlägg
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> </p>
<p><a href="../msystem/skrivindata.php">lägg till sida</a><br>
<a href="../msystem/andradata.php">ändra data</a><br>
navlink3<br>
navlink4<br>
navlink5 </p>
<p> </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
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
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
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
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
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
aaah! :)
Fungerar fortfarande inte. Skriptet som du postade ovan skriver ut "text". Fungerar det hos dig?
nicclasMedlem sedan feb. 20001 061 inlägg
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
Hey, där ser man. Nu fungerar det. :)
Tack för hjälpen, Spin och nicclas. :)