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.
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.
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); ?>
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);
<?php $teksti = "Tekstiä tekstiä tekstiä [tag:]tämä pitäisi saada[:tag] tekstiä tekstiä."; echo preg_replace("/.+?(\\[[a-z]+\\:\\])(.+?)(\\[\\:[a-z]+\\]).+/", "$2", $teksti); ?>
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ä.";
<?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.
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ä...
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);
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ä.
<?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); ?>
Aihe on jo aika vanha, joten et voi enää vastata siihen.