Autor Zpráva
matlala
Profil
ahoj,
potřeboval bych pomoct s úpravou reguláru pro mpřeklad odkazů. Měl by přeložit vše s http:// (včetně zvláštních znaků v URL-#%...). Alwe bay nepřekládal nic uvnitř html tagů<tag atributy="http://url.cz">.

Můj script je tady:
<?php
header("Content-Type: text/html; charset=UTF-8");
$text=' <div class="gagdet-cont"> <div class="main-cont"> <h3 class="title s_win_title">
<span class="text"><a href="http://www.horoskopy.cz/">Horoskopy</a></span> <span class="edit"> <a href="/nastaveni-horoskopu" class="edit-text">nastavit znamení</a> </span>
<span class="bck"></span> </h3> <div class="g-cnt s_win_area">
<p> <span class="zodiac-8-img-span">
<img src="http://seznam.cz/st/img/zodiac/8.gif" width="40" height="30" alt="Štír" /></span>
<a href="http://horoskopy.cz/stir/"><strong>Štír:</strong> Stanete se bezděčným svědkem rozmluvy, která vám otevře oči, chraňte se však přiznat, odkud své informace máte....</a> </p>
<div class="clear"></div> </div> </div> </div> 
</div>';//zkušební kus html ze seznam.cz
$regular_href='http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)';//regulár pro překlad. Překládá
$slova = explode(" ",$text);
                                $text = "";
                                for($i = 0; $i < sizeof($slova); $i++) {
                                        if(eregi_replace($regular_href, '<a href="http://\\1">http://\\1</a>', $slova[$i])) {
                                        $delka = strlen($slova[$i]);
                                        $zpracuj_cast=substr($slova[$i], 0, $delka);
                                        $cast=wordwrap($zpracuj_cast, 60, " ", 1);
                 
                                                $slova[$i] = eregi_replace($regular_href, '<a href="http://\\1">'.$cast.'</a>', $slova[$i]);
                                        } else {
                                                $slova[$i] = wordwrap($slova[$i], 60, " ", 1);
                                        }
                                        $text .= " ".$slova[$i];
                                }
// převod odkazů

echo $text; 

?>


předem díky protože reguláry jsou dost silný kafe, snažím se je pořádne pochopit už asi půl roku a skoro nic.
Casper
Profil
zkus:
$regular_href='[\s]http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)';//regulár pro překlad. Překládá

pak by se měl odkaz převést pouze pokud před vlastním URL nachází nějaký prázdný znak(mezera třeba)
matlala
Profil
nee, nefunguje, prázdný znak tam být nemusí může to být </tag>http://...<tag>, mám to totiž z tinymce editoru, takže to je HTML i s nepřeloženými odkazy.
Casper
Profil
V tom případě zkus definovat, že řetězec nesmí začínat =" já osobně jsem to zkoušel nějak takhle:
$regular_href='[^=\"]http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)';

ale nefungovalo to takže to asi nebude správně :) , zkus si s tím pohrát, když se ti to podaří, napiš sem jak to funguje at se taky přiučím :)
matlala
Profil
no ležel jsme v jedné knížce co mám a vztam bylo že začátek nesmí začínat stylem
^[^=\"]
, ale taky to nejde
matlala
Profil
zatím mi funguje jenom
$regular_href='^http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)';//regulár pro překlad

Přeloží
<div class="clear"></div> </div> </div> </div><img src="http://vput.cz/obrazek.jpg" alt="obrazek">
</div> http://horoskopy.cz/stir/[/pre]

ale nepřeloží
<div class="clear"></div> </div> </div> </div><img src="http://vput.cz/obrazek.jpg" alt="obrazek">
</div>http://horoskopy.cz/stir/
kvůli tomu že na druhém řádku není před odkazem mezera
matlala
Profil
asi to mám, nic lepšího jsme nevymyslel:
function PrevodOdkazu($vstup,$MaxDelka=100,$MaxDelkaSlova=100){
$text=eregi_replace(" +", " ", $vstup);//odstraní přebytečné mezery
$text = eregi_replace('http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)', ' http://\\1 ', $text);//přidá před a za odkaz mezery
$text = eregi_replace('" http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*) "', '"http://\\1"', $text);//odsraní mezery v atributech html-třeba u href="http://..."
$regular_href='^(http://[a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)$';//regulár pro překlad. Překládá
$slova = explode(" ",$text);
$text = "";
for($i = 0; $i < sizeof($slova); $i++) {
if(eregi_replace($regular_href, '<a href="http://\\1">http://\\1</a>', $slova[$i])) {
$cast=substr($slova[$i], 0, $MaxDelka);
if(strlen($slova[$i])>$MaxDelka){$cast.="...";}//pokud je odkaz delší než $MaxDelka bude zkrácen na $MaxDelka a přidají s eza něj ...(tečky))
                 
$slova[$i] = eregi_replace($regular_href, '<a href="http://\\1">'.$cast.'</a>', $slova[$i]);//samotný převod
} else {
$slova[$i] = wordwrap($slova[$i], $MaxDelkaSlova, " ", 1);//zalomí extrémě dlouhá slova delší než $MaxDelkaSlova 
}
$text .= " ".$slova[$i];
}
$preklad=array("&"=>"&amp;"," <a href=\""=>"<a href=\"","</a> "=>"</a>");
$text=strtr($text,$preklad);//přeloží odkazy do správné podoby s ASCII a převede zpátky mezery před a za odkazem
return $text;
}

Tohle ošetřuje nejen odkazy ale i délku slov a převádí & na ASCII &amp;
Pokud má někdo lepší řešení sem s ním
matlala
Profil
tady ještě vylepšení:
function PrevodOdkazu($vstup,$MaxDelka=100,$MaxDelkaSlova=100){
$text=eregi_replace(" +", " ", $vstup);//odstraní přebytečné mezery
$text = eregi_replace('http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)', ' http://\\1 ', $text);//přidá před a za odkaz mezery
$text = eregi_replace('" http://([a-zA-Z0-9\?=%&/\$\._äëöü#;-]*) "', '"http://\\1"', $text);//odsraní mezery v atributech html-třeba u href="http://..."
$regular_href='^(http://[a-zA-Z0-9\?=%&/\$\._äëöü#;-]*)$';//regulár pro překlad. Překládá
$slova = explode(" ",$text);
$text = "";
for($i = 0; $i < sizeof($slova); $i++) {
if(eregi_replace($regular_href, '<a href="\\1">'.$cast.'</a>', $slova[$i])) {
$cast=substr($slova[$i], 0, $MaxDelka);
if(strlen($slova[$i])>$MaxDelka){$cast.="...";}//pokud je odkaz delší než $MaxDelka bude zkrácen na $MaxDelka a přidají s eza něj ...(tečky))             
$slova[$i] = eregi_replace($regular_href, '<a href="\\1">'.$cast.'</a>', $slova[$i]);//samotný převod
} else {
$slova[$i] = wordwrap($slova[$i], $MaxDelkaSlova, " ", 1);//zalomí extrémě dlouhá slova delší než $MaxDelkaSlova 
}
$text .= " ".$slova[$i];
}
$vychozi=array("&"," <a href=\"","</a> ");
$nahrad=array("&amp;","<a href=\"","</a>");
$text=str_replace($vychozi,$nahrad,$text);//přeloží odkazy do správné podoby s ASCII a převede zpátky mezery před a za odkazem
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: