webForumDet fria alternativet

preg_replace – Enbart behålla det som matchar mönstret

11 svar · 798 visningar · startad av prplxr

prplxrMedlem sedan juni 2012582 inlägg
#1

Hejsan, svejsan!

Sitter och klurar lite med RegExp. Har kunnat det bra förr, men nu är det som bortblåst så jag försöker lära mig det på nytt.

Jag har ett formulär med två fält som representerar början och slutet av mitt mönster respektive. Hur får jag min preg_replace att kasta bort allt förutom just det som matchas av mitt mönster?

Denna kod har jag nu, och jag ser ju hur fel det är, men det är där jag är just nu:

preg_replace('/('.$str1.')(.*?)('.$str2.')/', "$2<br /><br />", $file)

Hur går jag vidare med detta?

metalboyMedlem sedan jan. 2005953 inlägg
#2

Antingen kan du matcha allt före och efter det du är intresserad av med .*, eller så kan du använda preg_match / preg_match_all och där skicka med även parameter tre.

<?php
$string = 'Behåll bara det som står inom "citationstecken", släng resten';

// Med preg_replace
echo preg_replace('/.*"(.*?)".*/s', '$1', $string);

echo '<br />';

// Med preg_match
if (preg_match('/"(.*?)"/', $string, $matches)) {
    echo $matches[1];
}
prplxrMedlem sedan juni 2012582 inlägg
#3

Inte riktigt så simpelt, detta. Jag läser in en HTML-fil och vill söka reda på träffar enligt mitt mönster i den. Till exempel vill jag hitta alla "<strong>allehanda text</strong>" så matar jag in "<strong>" i första fältet i formuläret och "</strong>" i andra.

Prövade med följande kod, men stötte på patrull:

if (preg_match('/('.$str1.')(.*?)('.$str2.')/', $file, $matches)) {
  for ($i=0; $i<count($matches); $i++) {
    echo "${matches[$i]}<br /><br />";
  }
}

Detta outputtar första träffen två gånger (och sedan inget mer) av någon anledning, trots att det i dokumentet jag testar med finns tre träffar.

Dessutom vill jag inte ha med själva mönstret i mina träffar, bara själva texten innanför mönstret.

metalboyMedlem sedan jan. 2005953 inlägg
#4

Då får du använda preg_match_all istället för preg_match.

<?php

$file = 'Blabla <strong>Behåll</strong> blabla <strong>detta också</strong> blabla <strong>och det här</strong>.';
$str1 = '<strong>';
$str2 = '</strong>';

if (preg_match_all('#('.$str1.')(.*?)('.$str2.')#', $file, $matches)) {
  for ($i=0; $i<count($matches[1]); $i++) {
    echo "{$matches[2][$i]}<br /><br />";
  }
}
prplxrMedlem sedan juni 2012582 inlägg
#5

metalboy skrev:

Då får du använda preg_match_all istället för preg_match.

Jag går och skäms en stund för att jag inte visste detta. Nu har jag iaf något att jobba med! Tusen tack!

(Dessutom såg jag typon i min kod också. Undrar varför jag inte fick något felmeddelande från den förrän jag försökte nå den tredimensionella arrayen.)

prplxrMedlem sedan juni 2012582 inlägg
#6

Jag tog bort lösningsmarkeringen då jag upptäckt att det inte alls fungerar som jag tänkt.

Om jag matar in till exempel "<p><b>" och "<p> <\/p" så hittar den ingenting, även om det finns i texten. Är det något mer jag totalt missar? Det här BORDE JU fungera. Eller?

if (preg_match_all('#('.$str1.')(.*?)('.$str2.')#', $file, $matches)) {
  for ($i=0; $i<count($matches[1]); $i++) {
    echo "<span class=\"msg\" style=\"font-size: 12px;\">Match #".($i+1).":</span><br /><div class=\"match\">" . htmlspecialchars($matches[2][$i]) ."</div>";
    echo $i < (count($matches[1])-1) ? "<br />" : "";
  }
} else {
  echo "<span class=\"msg\">Now THAT's what I call a steam horse! No matches found!</span>";
}

Alltså, den visar "Now THAT's...".

metalboyMedlem sedan jan. 2005953 inlägg
#7

Hur ser datat i $file ut?

prplxrMedlem sedan juni 2012582 inlägg
#8

Där har jag laborerat med en massa olika filer. Tagit mer eller mindre komplexa dokument från lite varstans på nätet. Den jag labbar med just nu är http://www.avigsidan.com/avigsidan/avigt001.html. Kika på källkoden så ser du.

metalboyMedlem sedan jan. 2005953 inlägg
#9

Kan du ge exempel på något du vill plocka ut där? Och hur dina $str1 och $str2 ser ut när du vill plocka ut det datat.

metalboyMedlem sedan jan. 2005953 inlägg
#10

Är det HTML du vill ha ut information ur så kanske det är enklare att använda någon HTML-parser, t.ex. DOMDocument eller Simple HTML Dom Parser.

prplxrMedlem sedan juni 2012582 inlägg
#11

Säg att jag vill ha alla poster på sidan. Jag tittar på källkoden och kommer fram till att det skulle fungera att använda mönstret </b></p> och <p><img src och använder således dessa som $str1 och $str2. Detta ger lite konstiga resultat, tycker jag.

[ EDIT ]

Men ju mer jag tittar på det, desto mer inser jag att det faktiskt kan vara så att mönstret finns på fler ställen än jag tidigare trott.

prplxrMedlem sedan juni 2012582 inlägg
#12

prplxr skrev:

Säg att jag vill ha alla poster på sidan. Jag tittar på källkoden och kommer fram till att det skulle fungera att använda mönstret </b></p> och <p><img src och använder således dessa som $str1 och $str2. Detta ger lite konstiga resultat, tycker jag.

[ EDIT ]

Men ju mer jag tittar på det, desto mer inser jag att det faktiskt kan vara så att mönstret finns på fler ställen än jag tidigare trott.

metalboy skrev:

Är det HTML du vill ha ut information ur så kanske det är enklare att använda någon HTML-parser, t.ex. DOMDocument eller Simple HTML Dom Parser.

Kikar lite på detta! Kan vara aktuellt. Jag vet inte exakt vilka förutsättningar jag har ännu.

134 ms totalt · 3 externa anrop · v20260731065814-full.30151723
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
131 ms — hämta tråd, inlägg och bilagor (db)