Kirjautuminen

Haku

Tehtävät

Keskustelu: Nettisivujen teko: Regular Expression ongelma

Sivun loppuun

Hoover [17.09.2009 13:14:52]

#

Mitenköhän voisi poistaa string muuttujasta kaiken muun, paitsi tiettyjen merkkien välissä olevan osuuden? Näitä tageja voidaan olettaa olevan ainoastaan yksi pari stringissä.

Esim.

Tekstiä tekstiä tekstiä [tag]tämä pitäisi saada[/tag] tekstiä tekstiä.

Eli tuosta jäisi jäljelle vain "tämä pitäisi saada". Kaikki muu paitsi tuo tagien välissä oleva osa pitäisi käytännössä korvata tyhjällä.

Toteutus pitäisi saada tehtyä nimenomaan PHP:n preg_replace-funktiota käyttämällä, koska on sidottu erääseen toiseen järjestelmään mikä odottaa regular expressionia tuohon funktioon.

Mietin että voisiko tämän tehdä jollain tämän tyyppisellä logiikalla:
1) Valitaan kaikki teksti.
2) Poistetaan valinnasta tagien välinen osuus.
3) Korvataan valinta preg_replacella tyhjällä.

Aikani tuumittua pääsin tähän pisteeseen:

/<tag>(.*?)</tag>/g

Yllä olevalla regular expressionilla saan valittua tagien välin, mutta siihen tulee mukaan myös tagit, mitä en halua.

Sami [17.09.2009 13:23:38]

#

https://www.php.net/manual/en/function.preg-match.php

Annat sille tuon kolmannen argumentin (array &$matches) niin $matches[1] sisältää ensimmäisten (ja tässä tapauksessa ainoiden) sulkujen sisällä olevan tekstin.

Teuro [17.09.2009 13:41:15]

#

Kokeile vaikka tällä:

<?php
$teksti = "Tekstiä tekstiä tekstiä [tag]tämä pitäisi saada[/tag] tekstiä tekstiä.";
echo preg_replace("/.+?(\\[[a-z]+\\])(.+?)(\\[[\\/a-z]+\\]).+/", "$2", $teksti);
?>

Hoover [17.09.2009 14:20:06]

#

Ok, kiitti vihjeistä. Nämä vähän auttaa tässä opiskelussa, mutta entäpä jos tagi onkin vaikka tällainen:

"tag:" ja lopetustagi ":tag"?

Testasin näin mutta en onnistunut:

$teksti = "Tekstiä tekstiä tekstiä tag:tämä pitäisi saada:tag tekstiä tekstiä.";
echo preg_replace("/.+?(\\[tag:])(.+?)(\\[:tag]).+/", "$2", $teksti);

Teuro [17.09.2009 14:24:23]

#

<?php
$teksti = "Tekstiä tekstiä tekstiä [tag:]tämä pitäisi saada[:tag] tekstiä tekstiä.";
echo preg_replace("/.+?(\\[[a-z]+\\:\\])(.+?)(\\[\\:[a-z]+\\]).+/", "$2", $teksti);
?>

Hoover [17.09.2009 14:30:16]

#

Meinasin että ilman näitä hakasulkuja. :)
Lopetti toiminnan kun koitin poistaa ne tuosta preg_replacesta.

Näin:

$teksti = "Tekstiä tekstiä tekstiä tag:tämä pitäisi saada:tag tekstiä tekstiä.";

MIB [17.09.2009 14:34:17]

#

<?php
$teksti = "Tekstiä tekstiä tekstiä tag:tämä pitäisi saada:tag tekstiä tekstiä.";
echo preg_replace("/.+?([a-z]+\\:)(.+?)(\\:[a-z]+).+/", "$2", $teksti);
?>

Näin.

Hoover [17.09.2009 14:37:51]

#

Noniin! Isot kiitokset nopeista tärpeistä. :)

Itsellä on täysin hakusessa tuo regular expressioni, kun tänään vasta ensimmäistä kertaa jonkun verran vilkuilin sitä...

Hoover [17.09.2009 16:40:58]

#

Hmm.. tuli mieleen vielä tämmöinen kysymys että mitenkä saadaan tuosta samasta rimpusta tietty määrä merkkejä määritetystä kohdasta eteenpäin?

Vaikkapa tuosta "tag:"-kohdasta eteenpäin 4 merkkiä otettaisiin, jolloin saataisiin sana "tämä".

Eikö sen pitäisi mennä jotenkin tähän tyyliin? En vaan saanut ihan toimimaan tätä...

$teksti = "Tekstiä tekstiä tekstiä tag:tämä pitäisi saada:tag tekstiä tekstiä.";
echo preg_replace("/.+?([tag:])(....).+/", "$2", $teksti);

Teuro [17.09.2009 17:08:47]

#

Lue edellisten vastausten lisäksi putkan opasta, josta selviää miksei tuo toimi. Vinkkinä siis tuo : -merkki. Lisäksi tag: merkkijonoa ei tule laittaa hakasulkujen sisään, vaan se voi olla ihan omanaan kaarisulkujen sisällä.

MIB [17.09.2009 17:37:07]

#

<?php
$teksti = "Tekstiä tekstiä tekstiä tag:tämä pitäisi saada:tag tekstiä tekstiä.";
$katkaistaan = preg_replace("/.+?([a-z]+\\:)(.+?)(\\:[a-z]+).+/", "$2", $teksti);
echo substr($katkaistaan, $i, 4);
?>

Sivun alkuun

Vastaus

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

Tietoa sivustosta