Jump to content
php.lv forumi

ka no stringa dabut mail adreses un tas konvertet?


alfs

Recommended Posts

ieksh mysql db glabajas daznedazadi teksti un ieksh tiem ir mail adreses, kuras izvadot vajadzetu konvertet no [email protected] uz <a href="mailto:[email protected]" onclick="return(sm('mana', 'adrese.lv'));">e-pasts</a>

 

skaidrs, ka vajadzetu ciklu, kas iet cauri stringam un skatas pec kadas regularas izteiksmes meila adreses un kad kadu atrod, parvers par vajadzigo. parverst varetu diezgan vienkarsi, bet nezinu, ka dabut gatavu to atrasanu, jo regular expressions man ir diezgan svesa lieta.

 

varbut kads var palidzet?

Link to comment
Share on other sites

/me lieto

 $txt=preg_replace_callback
 (
  '#([^"\'><0-9a-z]|^)([0-9a-z][-_\.]?[0-9a-z]*@[0-9a-z]+[-.]?[0-9a-z]+\.[a-z]{2,})([^"\'><])#mi',
  'mcallback',
  $txt
 );

 

kur iekš function mcallback() starp citu taisa

$mail=str_replace('@','@',$mail);
... str_replace('.','.dot.',$mail);
... str_replace('@','.at.',$mail);

 

resp. [email protected] pārveido par

<a href="mailto:some.at.some.dot.some.dot.lv" onclick="return spam(this)">[email protected]</a>

 

JavaScripts savukārt satur:

function spam(element)
{
if (!element.href) return;
addr=element.href;
addr=addr.replace(new RegExp('\.at\.'),'@');
addr=addr.replace(new RegExp('\.dot\.','g'),'.');
mw=window.open(addr,'');
element=null;
return false;
}

Link to comment
Share on other sites

tu varetu iedot mcallback() pilno versiju? (ar visiem matches un return)

cik saprotu, tad mail adresei vajadzetu slepties zem matches[0], ja? bet ja ta tas ir, tad, manuprat, ta regulara izteiksme nav isti pareiza - cik nu man iznaca izlaist cauri stringam ar mail adresem un katram pielikt sakuma un beigas #, lai redzetu, ko vins ir atradis. bet nu loti iespejams, ka kludos, jo no tas izteiksmes neko daudz nesaprotu.

 

un kapec $mail=str_replace('@','@',$mail); ? kada jega replacot @ ar @?

Link to comment
Share on other sites

str_replace @ pret _&_#64; vizuāli izskatās tāpat, bet vairums spambotu neķer

 

visa padarīšana ir vienas lielākas padarīšanas daļa, bet svarīgākais izskatās apm. tā:

$mail=$parts[2];//[email protected]
$tmp='<a ';
if ($opt['linkup']['nospam'])
{
 $tmp.='onclick="return '.$opt['linkup']['nospam'].'(this)" ';
 $mail=str_replace('@','_&_#64;',$mail);
 $parts[2]=str_replace('.','.dot.',$parts[2]);
 $parts[2]=str_replace('@','.at.',$parts[2]);
}
   if ($opt['linkup']['mlink']>1)
 $tmp.='class="email" ';	
$tmp.='href="mailto:'.$parts[2].'">';
if ($opt['linkup']['mlink']>2)
 $tmp.='<img alt="" src="'.$opt['linkup']['email'].'" />';
   return $tmp.$parts[1].$mail.'</a>'.$parts[3];

 

$opt['linkup']['nospam'] nosaka de-protektēšanas javasvript f-jas nosaukumu, e.g. kā augstākminētās 'spam'

$opt['linkup']['mlink'] - ja 2 (vai vairāk), tad tiek a elementam tiek pielikta CSS klase "email" (kurai var uzlikt before: {content:'links uz mailu'}), bet content nestrādā iekš tā IE (pagaidām vienīgais no CSS, kas man pietrūksts iekš IE)

ja 3 vai vairāk, tad priekšā linka tekstam tiek pielikta ikoniņa ar aploksnīti vai ko tml. (otrā funkcija, kas linko URLus, tos vel sašķiro pa "uz attēlu, lokāls, nelokāls, šajā saitā")

Edited by Venom
Link to comment
Share on other sites

update:

#([^"\'><0-9a-z]|^)([0-9a-z][-_\.]?[0-9a-z]*@[0-9a-z]+[-.]?[0-9a-z]+\.[a-z]{2,})([^"\'><]|$)#mi

note the |$ in the last brackets - neķēra adreses kas bija pašās teksta beigās bez kaut kāda punktuācijas simbola pēc tam

 

 

izteiksmes paskaidrojums:

a) mi beigās - multilīniju, caseless

 

pirmais () - a) ^ sākumā iekš [] nozīmē "jebkurš simbols izņemot ...", tātad izņemot " un ' (lai atmestu situācijas href=_"|'[email protected]"|'), >, lai atmestu situācijas (<a ..._>[email protected]), < (visādam gadījumam), vai līnijas sākums |^

 

tālāk seko paša email meklēšana, kur emails ir teksts, kas sākas ar vismaz vinu latīņu burtu vai ciparu, tālāk var saturēt -, _, vai . (man škiet, ka nedrīkstēja būt vairāki, ja kas []? vietā ? aizvietojam pret *) un jebkuru daudzumu ciparu vai latīņburtu, zīmi @, domēna daļu, kas līdzīga pirmai, punkts, domēnzonas daļu, kas parasti ir no 2 simboliem (lv,com,info, un kas zin vai drīz nebūs arī kāds .business)

 

beigu() līdzīgi kā pirmajā () pieļauj vai nu rindas beigas (|$) vai jebkuru simbolu, kas nav " vai ' (tā pati href="|'[email protected]_"|'_), < (<a ...>[email protected]_<_/a>) un > visādam gadījumam

 

ņemam regulāro izteiksmi, ejam uz http://venom.eclub.lv/VenRExp/ iekopējam augšējā inputā, iekš haystak ierakstam kaut kādu ([email protected]) [email protected] un skatāmies, kādi matči sanāk, ekperimentējam ;)

Link to comment
Share on other sites

alfs, dari vienkārši šādi:

<?php
 $text = '[email protected] navmails [email protected] te ar nav @ mails [email protected]';
 $text = preg_replace('/([-_\.\w\d]+)@(([-_\w\d]+\.)+)(\w+)/mi', '<a href="mailto: \1 at \2\4" onclick="return(sm("\1", "\2\4"));">\1 at \2\4</a>', $text);
 echo $text;
?>

man nepatīk tas, kas notiek, ja tavs preg tiek palaists pa virsu šādam tekstam:

 

[email protected]

<a href="mailto:[email protected]">[email protected]</a>

 

<a href="mailto:<a href="mailto: mail_mail at domain.lv"

 

deļ tā jau manā kļūdas, ka mēģinu izvairīties no tādas situācijas ;)

Link to comment
Share on other sites

A kā tas ir, ka nepareizi nopostojās? Man vienmēr, ko esmu te rakstījis, postojās tieši tā kā esmu ierakstījis. :huh:

kaut kas ar slašiem ne vienmēr ka vajag

vai nu arī kopējot no apstofu ieķšām ('text cut text') jāatslešo atpakaļ un saiet grīstē (atslešo to, kam vajag palikt noslašotam)

Link to comment
Share on other sites

man nepatīk tas, kas notiek, ja tavs preg tiek palaists pa virsu šādam tekstam:

 

[email protected]

<a href="mailto:[email protected]">[email protected]</a>

Es saprotu, ka mans ir ļoti primitīvs pregs, bet ja pats zin, kur un kā to pielieto, tad jau viss oki. Un kamdēļ mocīties un mēģināt rakstīt ko universālu, ja zinu, ka to pielietošu tikai vienu reizi :)

Link to comment
Share on other sites

×
×
  • Create New...