Autor Zpráva
SteveO
Profil *
Zdravím, pomůže někdo se zápisem preg_replace?
Potřeboval bych v textu najít a nahradit všechny URL adresy tímto způsobem:
http(s)://www.domena.cz/sekce1/sekce2/sekce3 na https://www.domena.cz/sekce3
Tedy tak, aby v URL zůstala jen část za posledním lomítkem. Díky.


Zanoření může být různě hluboké, takže může být různý počet lomítek.
RastyAmateur
Profil
SteveO:
Pokud jsou adresy dány VŽDY v uvedeném příkladu (http(s)://blabla), můžeš to vyřešit i bez reguláru. Třeba pomocí explode, nebo str_* funkcí
SteveO
Profil *
Předmětný řetězec neobsahuje jen tu URL, ale dlouhé texty (popisky produktů), potřebuju regulár...
Luky
Profil
Mohlo by stačit třeba jen něco takového:
preg_match_all("/.*domena\.cz(.*)\/.*/", $input, $matches);
foreach ($matches[0] as $key => $oldDomain){
  $newDomain = str_replace($matches[1][$key], '', $oldDomain);
}

přidat ještě nějaký ify a nahradit oldDOmain za newDomain tam kde potřebuješ.
DarkMeni
Profil
Nebo na jeden řádek
<?php
$url = "dfkljdlkj https://www.domena.cz/sekce1/sekce2/lkdfjlk/sekce3 dfjlk  https://www.domena.cz/sekce1/sekce2/sekce6755";
echo preg_replace("|(https?://www\.domena\.cz)[/\w]+(/\w+)|", "$1$2", $url);
// pripadne:
echo preg_replace("|(https?://(www\.)?domena\.cz)[/\w]+(/\w+)|", "$1$3", $url);
?>
Pokud teda nechceš řešit rychlost kódu, jinak preg_replace je mnohem pomalejší než by byl strpos, substr a str_replace
Edit: teda... blbě, tohle sežere všechen text okolo a nechá jen ty adresy, což asi nechceš, sorry xD
Edit2: Aha, nesežere, tak dobrý =)
SteveO
Profil *
Nakonec jsem vyplodil tohle, potřeboval jsem i výsledky nahrazení:

private function shortenUrls($text) {
  $text = preg_replace_callback("|//(www.)?domena.cz/([0-9a-zA-Z\-/]*)|", function ($matches) {
    if (strpos($matches[0], 'domena.cz/') !== false) {
      $m1 = explode('.cz/', $matches[0]);
      $m2 = explode('/', trim($m1[1], '/'));
      if (count($m2) > 1) {
        $m3 = end($m2);
        $result = '//domena.cz/' . $m3;
        echo "\"<span style=\"color: red;\">" . $matches[0] . "</span>\" &rarr; \"<span style=\"color: blue;\">" . $result . "\"</span><br />";
        return $result;
      }
    }
    return $matches[0];
  }, $text);
  
  return $text;
}

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0