webForumDet fria alternativet

Göra länkar av ren html-text?

PHP

8 svar · 1 000 visningar · startad av Danne V

Medlem sedan aug. 20068 090 inlägg
Frågan#1

Jag använder ett enkelt scrape-skript för att hämta nyheter från en viss sida.
Tyvärr saknas länkar tillbaka till den sidan.

Dom använder en särskild span-class (.rubriker) för alla rubriker. Hur lägger man anchor-taggar runt den?

Så här ser scrape-skriptet ut:

require("taggrab.class.php"); 
$urlrun="http://nyhetskällan...";
$stag="<p><span class=";
$etag="</p>";
$tspider = new tagSpider();
$tspider->fetchPage($urlrun);
$linkarray = $tspider->parse_array($stag, $etag); 
echo "<h2>Nyheter ".$urlrun."</h2><br />";
foreach ($linkarray as $result) {
echo $result;
echo "<hr />";
}

..och källkoden i sidan med nyheterna är byggd så här:

<p><span class="rubriker">Här är rubriken</span><br />Här är artikelns brödtext</p>

...och så här skulle jag vilja att den blev:

<p><span class="rubriker"><a href="http://nyhetskällan...">Här är rubriken</a></span><br />Här är artikelns brödtext</p>

Alltså: Det ska vara en och samma "statiska" sökväg till alla artiklar. Och det spelar ju ingen roll om span-klassen omsluter länken eller tvärtom....

Någon?

Medlem sedan aug. 20068 090 inlägg
#2

Förresten, om det är relativt enkelt att lägga in en funktion som trunkerar (klipper av) outputen så att varje artikel inte återges i sin helhet utan bara t.ex. 200 tecken vore det inte dumt..... :)

Medlem sedan jan. 2005953 inlägg
#3

Använd ett reguljärt uttryck (regular expression) för att få in länken. Nu vet jag inte hur tagSpider fungerar, men gissar att du kan prova med något liknande detta:

echo preg_replace('#<span class="rubriker">(.*?)</span>#i', '<span class="rubriker"><a href="http://nyhetskällan...">$1</a></span>', $result);

Är det artikelns brödtext du vill klippa efter exempelvis 200 tecken, eller är det rubrik + brödtext som ska vara max 200 tecken?

Medlem sedan aug. 20068 090 inlägg
#4

metalboy skrev:

Använd ett reguljärt uttryck (regular expression) för att få in länken. Nu vet jag inte hur tagSpider fungerar, men gissar att du kan prova med något liknande detta:

echo preg_replace('#<span class="rubriker">(.*?)</span>#i', '<span class="rubriker"><a href="http://nyhetskällan...">$1</a></span>', $result);

Najs! Ska omedelbart testa!

metalboy skrev:

Är det artikelns brödtext du vill klippa efter exempelvis 200 tecken, eller är det rubrik + brödtext som ska vara max 200 tecken?

Det är väl enklast att bara kapa alltsammans efter X antal tecken...? Så får jag testa hur många som får det att se mest vettigt ut...

Medlem sedan aug. 20068 090 inlägg
#5

metalboy skrev:

echo preg_replace('#<span class="rubriker">(.*?)</span>#i', '<span class="rubriker"><a href="http://nyhetskällan...">$1</a></span>', $result);

Funkade galant!
Tackar!
(helvete, jag blir grymt avundsjuk på folk som kan sånt där....) :P

Medlem sedan jan. 2005953 inlägg
#6

Danne V skrev:

Det är väl enklast att bara kapa alltsammans efter X antal tecken...? Så får jag testa hur många som får det att se mest vettigt ut...

Problemet med att kapa rakt av är att då räknas ju även HTML-tecknen som tecken... Dvs, du kan råka kapa mitt i </span> t.ex.

Om du begränsar längden på brödtexten - och den inte innehåller några HTML-taggar - så blir funktionen väldigt enkel. Det räcker då att använda substr().

Annars blir det lite krångligare, för att se till så man inte kapar någon HTML-tag.

Medlem sedan aug. 20068 090 inlägg
#7

metalboy skrev:

Problemet med att kapa rakt av är att då räknas ju även HTML-tecknen som tecken... Dvs, du kan råka kapa mitt i </span> t.ex.

Om du begränsar längden på brödtexten - och den inte innehåller några HTML-taggar - så blir funktionen väldigt enkel. Det räcker då att använda substr().

Annars blir det lite krångligare, för att se till så man inte kapar någon HTML-tag.

Oj. Jag vill ju inte klippa mitt i en tagg...
Jag har kikat på substr men fattar nada, eller i alla fall inte var jag i så fall skulle lägga in den funktionen. Så om du har en minut över...? (host, host) :r

Medlem sedan jan. 2005953 inlägg
#8

Exempel med utökat reguljärt uttryck där brödtexten klipps efter 200 tecken:

function content_limit($content, $limit=200) {
    if (strlen($content) > $limit)
        return substr($content, 0, $limit) . '...';
    return $content;
}

require("taggrab.class.php"); 
$urlrun="http://nyhetskällan...";
$stag="<p><span class=";
$etag="</p>";
$tspider = new tagSpider();
$tspider->fetchPage($urlrun);
$linkarray = $tspider->parse_array($stag, $etag); 
echo "<h2>Nyheter ".$urlrun."</h2><br />";
foreach ($linkarray as $result) {
    echo preg_replace('#<p><span class="rubriker">(.*?)</span><br />(.*?)</p>#ie', '"<p><span class=\"rubriker\"><a href=\"http://nyhetskällan...\">$1</a></span><br />" . content_limit("$2") . "</p>"', $result);
    echo "<hr />";
}

Lägg märke till att jag har lagt till flaggan e (eval) till det reguljära uttrycket. Det gör att jag kan använda funktionsanrop i replace-argumentet.

Medlem sedan aug. 20068 090 inlägg
#9

metalboy skrev:

Exempel med utökat reguljärt uttryck där brödtexten klipps efter 200 tecken:

Lägg märke till att jag har lagt till flaggan e (eval) till det reguljära uttrycket. Det gör att jag kan använda funktionsanrop i replace-argumentet.

Suveränt!
Fungerar perfekt!
Tusen tack för hjälpen!!!! :bire

258 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2
120 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
121 ms — ändringar (db)