Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: PHP: www-osoitteiden muuttaminen linkeiksi tekstin joukosta

Sivun loppuun

reca [17.02.2011 14:22:19]

#

Otsikon pitäisi olla suhteellisen kuvaava siihen, mitä haen. Tarvitsisin PHP-koodin (preg_match tms.), joka löytäisi annetusta tekstistä www-osoitteet ja tekisi niistä html-linkit.

Hommasta uupuu siis oikeanlainen preg_match-lauseke. Tällainen varmasti internetin valtaväyliltä löytyy, mutta en itse löytänyt kuin sellaisia linkkien tarkistajia, jotka tarkistavat onko annettu merkkijono oikea linkki.

Lisäksi löytyi itsetehtyjä ja siltä näyttäviä (ei niin positiivisessä mielessä) kyhäelmiä, että en niihin välttämättä luottaisi.

Jos siis löytyisi vaikka linkki sopivalle sivulle mistä pääsen eteenpäin. Kiitos :).

EDIT: Tietysti heti tämän viestin jälkeen löysin yhden, joka ainakin aluksi tuntuisi olevan ihan pätevä :-P

$text = preg_replace("
  #((http|https|ftp)://(\S*?\.\S*?))(\s|\;|\)|\]|\[|\{|\}|,|\"|'|:|\<|$|\.\s)#ie",
  "'<a href=\"$1\" target=\"_blank\">$3</a>$4'",
  $text
);

Osoitteesta: http://stackoverflow.com/questions/206059/php-validation-regex-for-url

Mikäli tuossa on jotakin suurempaa vikaa niin laittakaa viestiketjuun jatkoa, kiitos :)

peg [17.02.2011 17:01:29]

#

Jotain tällaista.

<?php
$line = ('Video: http://toru.ee/view/d2b28d613275
lue lisää www.toru.ee
'); ?>
<?php   #### http osoitteet linkeiksi

    $linx = ereg_replace("/[http]/", "<a href=\"\\0\">\\0</a>", $line);

echo $linx;
?>

<?php   #### www osoitteet linkeiksi

    $linx = ereg_replace("/[www]/", "<a href=\"\\0\">\\0</a>", $line);

echo $linx;
?>

peg [17.02.2011 20:02:01]

#

Sorry, toi ereg_replace on jäämässä pois.
tämä parempi.

<?php

$linx = preg_replace("/(http|www.).*/m", "<a href=\"\\0\">\\0</a>", $line);

echo $linx;
?>

Metabolix [17.02.2011 20:26:34]

#

peg, mitä ihmettä? O_o Eihän näistä koodeistasi kummassakaan ole mitään järkeä. Vai onko sinusta oikein tehdä mistä tahansa http-sanaa seuraavasta asiasta – esimerkiksi tästä – linkki?

Kelvollinen URL on helppo tunnistaa: siinä saa olla vain tiettyjä merkkejä (erikoismerkit kuuluu enkoodata). Varsinainen ongelma on kuitenkin arvata, mihin linkki loppuu, jos perässä on piste, kysymysmerkki tai vaikka kolme pistettä. Tunnistukseen ei ole yksiselitteistä oikeaa ratkaisua, koska linkin on laillista päättyä pisteeseen tai kysymysmerkkiin mutta toisaalta tekstissä nämä usein kuuluvat linkin ulkopuolelle. On siis mahdotonta tunnistaa molemmanlaiset tapaukset aina oikein, kuten seuraavassa tekstissä:

Vilkaiskaapa osoitteeseen https://www.ohjelmointiputka.net/index.php.
Sivustolla on muuten myös jännä tiedosto, jonka nimi loppuu pisteeseen!
https://www.ohjelmointiputka.net/testit/pistetiedosto.txt.
(Ihan oikeasti on, voit kopioida osoitteen selaimeen ja testata.)

Hyvä arvaus on kuitenkin jättää osoitteen lopusta erikoismerkit pois, koska ani harvoin kukaan tekee jälkimmäisen kaltaista tiedostoa.

Toinen ongelma on, että useimmat selaimet näyttävät erikoismerkit osoitteessa ilman enkoodausta ja käyttäjätkin ehkä olettavat, että niitä voi kirjoitella foorumille sellaisenaan. Ohjelmointiputkassa on tähän tarkoitukseen tällä hetkellä käytössä seuraava heuristiikka:

// Kielletyt merkit: ()[]{}<>"' ja välit
$m = "\\(\\)\\[\\]\\{\\}<>\"'\\s";

// Merkit, joihin linkki ei yleensä lopu:
$ei_lopussa = ".,:;?!";

// Lauseke:
$regex =
  "(?:[-+a-z]+://|mailto:)". // Alussa jotain:// tai mailto:
  "(?:".
  "[(][^/{$m}]*[)]?|".       // Kaarisulut osana jotain polun osaa
  "[{][^/{$m}]*[}]?|".       // Aaltosulut osana jotain polun osaa
  "[^{$m}]".                 // Muuta sisältöä
  ")+".
  "(?<=[^{$ei_lopussa}])";   // Tarkistetaan, että osoite loppuu oikein.

$regex = "`{$regex}`s";

peg [18.02.2011 14:57:47]

#

No nyt tän pitäisi jo rulettaa...

<?php
$line = ('
Video: http://toru.ee/view/d2b28d613275 hyvältä näyttää
musa http://localhost/voice/?pg=pp&sv=zz&page=temp/pp.m3u soi
lue lisää www.toru.ee
');

$linx = preg_replace("`(http|ftp)+(s)?:(//)((\w|\.|\-|_)+)(/)?(\S+)?`i", "<a href=\"\\0\"> \\0</a>", $line);
$linx = preg_replace("`(www)((\w|\.|\-|_)+)(/)?(\S+)?`i", "<a href=\"\\0\"> \\0</a>", $linx);
echo $linx;
?>

-tossu- [18.02.2011 15:21:06]

#

peg kirjoitti:

No nyt tän pitäisi jo rulettaa...

Niin varmasti pitäisi, mutta kun ei ruleta. Koodi antaa ulos tällaisen sivun:

Video: <a href="http://toru.ee/view/d2b28d613275"> http://toru.ee/view/d2b28d613275</a> hyvältä näyttää
musa <a href="http://localhost/voice/?pg=pp&sv=zz&page=temp/pp.m3u"> http://localhost/voice/?pg=pp&sv=zz&page=temp/pp.m3u</a> soi
lue lisää <a href="www.toru.ee"> www.toru.ee</a>

Eli viimeisen linkin alusta puuttuu http://-osuus, mikä aiheuttaa sen, ettei linkki toimi halutulla tavalla.

peg [18.02.2011 15:54:40]

#

No voi sun ryökäle...:(

<?php
$line = ('
Video: http://toru.ee/view/d2b28d613275 hyvältä näyttää
musa http://localhost/voice/?pg=pp&sv=zz&page=temp/pp.m3u soi
lue lisää www.toru.ee
');

$linx = preg_replace("`(http|ftp)+(s)?:(//)((\w|\.|\-|_)+)(/)?(\S+)?`i", "<a href=\"\\0\"> \\0</a>", $line);
$linx = preg_replace("`(www)((\w|\.|\-|_)+)(/)?(\S+)?`i", "<a href=\"http://\\0\"> \\0</a>", $linx);
echo $linx;
?>

Metabolix [18.02.2011 17:03:18]

#

Kokeillaanpa pegin viritelmää vielä yhdellä ihan tapotavallisella tekstillä:

Katso https://www.ohjelmointiputka.net/keskustelu/!

Jännitys tiivistyy...

Katso <a href="http://<a href="https://www.ohjelmointiputka.net/keskustelu/!">"> www.ohjelmointiputka.net/keskustelu/!"></a> http://<a href="https://www.ohjelmointiputka.net/keskustelu/!</a>"> www.ohjelmointiputka.net/keskustelu/!</a></a>

Yksi osoite, kolme <a>:ta ja neljä </a>:ta. Ei tainnut mennä ihan nappiin?

Muutenkin täytyy ihmetellä, mihin näitä pegin viritelmiä koko keskustelussa tarvitaan, kun jo aloitusviestin koodi toimii huomattavasti järkevämmin ja luotettavammin. Siinäkin on tosin ongelmana vielä, että &-merkki pitäisi muuttaa &amp;-merkinnäksi. Suoralla korvauksella on vaikea päästä hyvään lopputulokseen, jos korvattavia asioita on monta (linkit, tagit, HTML:n erikoismerkit kuten <> ym.), koska yksi korvaus vaikuttaa seuraaviin.

Putkassa on käytössä aiemmin mainitsemani lauseke, mutta viestin muunnos kokonaisuudessaan tapahtuu hieman toisella tavalla: viesti katkotaan tagien kohdalta ja vain väliin jäävät osat ajetaan linkkikorvauksen läpi (paitsi jos sisältö on jo valmiiksi merkitty linkiksi). Yllä mainittu teksti näyttää tältä: "Katso https://www.ohjelmointiputka.net/keskustelu/!"

peg [18.02.2011 18:45:07]

#

Metabolix kirjoitti:

Tunnistukseen ei ole yksiselitteistä oikeaa ratkaisua, koska linkin on laillista päättyä pisteeseen tai kysymysmerkkiin mutta toisaalta tekstissä nämä usein kuuluvat linkin ulkopuolelle.

Mod. korjasi lainaustagit!

Metabolix [18.02.2011 18:48:09]

#

Tiedän kyllä, että olen kirjoittanut noin. (Oletko muuten kuullut lainaustageista? Sellainen selventäisi viestiäsi huomattavasti.) Mutta katsopa nyt tuota korvauksesi tulosta: siinä on vikana aika paljon muutakin kuin huutomerkin sijainti. Sitä paitsi olisin voinut laittaa linkin perään vaikka mitä osoitteeseen kuulumattomia merkkejä, ja skriptisi olisi nielaissut nekin mukisematta ja täysin epäloogisesti – kuten se itse asiassa tuossakin teki jälkimmäisellä korvauskierroksellaan, nimittäin otti merkit "> ja </a> mukaan osoitteeseen.

peg [18.02.2011 19:45:41]

#

Jostain vain on lähdettävä liikkeelle, kun huomasin että tuo ereg-replace
poistuu. https://www.php.net/manual/en/function.ereg-replace.php
Noita esimerkkejä saa jokainen muokata ja soveltaa miten haluaa. vinkeiksi.


Sivun alkuun

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta