Versio

[RegEx] Hyperlink naar tekst

Overzicht Reageren

Elwin - Fratsloos

Elwin - Fratsloos

04/11/2009 09:37:00
Quote Anchor link
Dit blijft mijn grote uitdaging: RegEx. :)

Ik zit met het volgende: een nieuwsbrief wordt opgemaakt met een WYSIWYG-editor. Als er in een van de items of de intro van de nieuwsbrief een hyperlink (in HTML) staat wil ik die graag omzetten naar platte tekst, maar met behoud van de omschrijving en de link er achter.

Voorbeeld
Input:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<a href="http://www.google.nl/">Google</a>
<a href="http://www.phphulp.nl" target="_blank">PHPhulp</a>


Output:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
Google (http://www.google.nl/)
PHPhulp (http://www.phphulp.nl)


Ik had een eregi_replace (zie hier onder), maar behalve dat die in PHP6 niet meer werkt, werkt deze ook niet voor beide bovenstaande opties. Laatst staan als er nog meer attributen aan de link worden meegegeven zoals rel, lang, etc.

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$item
['tekst'] = eregi_replace("<a(.*)href=\"(.*)\"(.*)>(.*)</a>", "\\4 (\\2)", $item['tekst']);
?>


Wie o wie kan mij helpen?

Let op: ik ben dus niet op zoek naar strip_tags, want ik moet dus eerst de link achter de omschrijving zetten.
 
PHP hulp

PHP hulp

25/05/2012 14:21:39
Gesponsorde koppelingen:
BHosted Hosting al vanaf € 1,- per maand

Controleer nu gratis jouw domeinnaam:

  
 
Koen

koen

04/11/2009 10:02:00
Quote Anchor link
als je googlet op regexp php, kom je als eerste bij deze tut:
http://www.phphulp.nl/php/tutorials/4/520/
 
Elwin - Fratsloos

Elwin - Fratsloos

04/11/2009 15:11:00
Quote Anchor link
Ok. Ik heb nu deze RegEx:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
<a href=\"[a-zA-Z0-9:/.=:;@_-~\?]+\"[a-zA-Z0-9:/.=:;@_-~\?[:space:]\"]*>[a-zA-Z0-9:/.=:;@_-~\?[:space:]]+</a>


Deze pas ik toe op de volgende tekst:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
<p>Praesent ut semper dui. Sed nec enim non nulla consectetur sagittis gravida quis elit. Curabitur scelerisque lobortis nibh a sollicitudin. Suspendisse <a href="mailto:test@domein.nl">eleifend</a> feugiat purus, in interdum ligula iaculis vel.</p>
<p>Vestibulum ornare tellus at libero vulputate at aliquam mauris consequat. Aliquam erat volutpat. Aliquam egestas, leo et <a href="http://lmgtfy.com/?q=google">malesuada iaculis</a>, leo turpis malesuada lorem, <a href="http://www.test.nl" target="_blank">ut</a> suscipit dolor libero ac lacus. Curabitur molestie scelerisque sodales. Ut ipsum odio, varius a accumsan sed, semper sit amet justo.</p>
Op http://gskinner.com/RegExr/ zie ik dan netjes dat die een match vindt die ik dan laat vervangen door een tekst. Dat werkt goed. Maar hoe zet ik dit nu goed in mijn code?

Ik heb dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
<?php
$item
['tekst'] = preg_replace("/<a href=\"[a-zA-Z0-9:/.=:;@~\?]+\">[a-zA-Z0-9:/.=:;@~\?[:space:]]+</a>/ie", "platteHyperlink('\\1')",$item['tekst']);
?>


Maar hij lijkt niet in de functie platteHyperlink te komen. De tekst is leeg bij het verzenden van de nieuwsbrief. En hoe haal ik nou precies die variabelen uit die RegEx (zoals die \\1)?
 

04/11/2009 15:58:00
Quote Anchor link
Volgens mij moet je dan kijken naar preg_replace_callback Elwin :)
 
Elwin - Fratsloos

Elwin - Fratsloos

07/11/2009 16:11:00
Quote Anchor link
Ik heb nu inderdaad preg_replace_callback gebruikt. Had die functie wel gezien, maar in een ander geval werkte preg_replace (met de e modifier, zie voorbeeld 4) ook. Ik heb nu dit:

Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$item
['tekst'] = preg_replace_callback("/<a\s+.*?href=[\"\']?([^\"\' >]*)[\'\"]?[^>]*>(.*?)<\/a>/i", "platteHyperlink",$item['tekst']);

function
platteHyperlink($aLink) {
    $aLink[1] = str_replace("mailto:","",$aLink[1]);
    $r = $aLink[2]." (".$aLink[1].")";

    return $r;
}

?>


Dat werkt dus. Daarna de boel 'omgebouwd' naar preg_replace welke nu ook werkt:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
<?php
$item
['tekst'] = preg_replace("/<a\s+.*?href=[\"\']?([^\"\' >]*)[\'\"]?[^>]*>(.*?)<\/a>/e", "platteHyperlink('\\1','\\2')",$item['tekst']);

function
platteHyperlink($link,$omschrijving) {
    $link = str_replace("mailto:","",$link);
    $r = $omschrijving." (".$link.")";

    return $r;
}

?>
 
Jonathan -

Jonathan -

07/11/2009 16:41:00
Quote Anchor link
Als je het wilt perfectioneren zou je iets moeten inbouwen dat je niet twee keer hetzelfde krijgt. Klinkt wat abstract, dus maar even een voorbeeldje.

Voorbeeldcode:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
<a href="http://www.google.com/">Google</a>
<a href="http://www.google.com/">http://www.google.com/</a>
<a href="http://www.google.com/">www.google.com</a>
<a href="http://www.google.com/">google.com</a>
<a href="mailto:aapje@aapje.nl">Aapje</a>
<a href="mailto:aapje@aapje.nl">aapje@aapje.nl</a>


Zou dus worden:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Google (http://www.google.com/)
http://www.google.com/ (http://www.google.com/)
www.google.com (http://www.google.com/)
google.com (http://www.google.com/)
Aapje (aapje@aapje.nl)
aapje@aapje.nl (aapje@aapje.nl)


Wat je zou willen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Google (http://www.google.com/)
http://www.google.com/
http://www.google.com/
http://www.google.com/
Aapje (aapje@aapje.nl)
aapje@aapje.nl


Het beste is om de hele a-tags eruit te filteren en die (in een losse functie) te verwerken. Als opstapje kan je eens een oud topic van mij bekijken, zie dan de post van Boaz. (Let niet op mijn gedrag daar, was toen nog een irritant klein kutkind.)
Gewijzigd op 01/01/1970 01:00:00 door Jonathan -
 
Elwin - Fratsloos

Elwin - Fratsloos

07/11/2009 16:47:00
Quote Anchor link
Thx voor je input, maar ik hou het zoals het is. In de tekstversie van de nieuwsbrief moet goed te zien zijn dat een bepaald woord (of zinsdeel) bij de daarop volgende link hoort. In nieuwsbrief teksten zal je ook niet zo snel een hyperlink zetten, maar een tekst waaraan een hyperlink is gekoppeld.
 
Karl Karl

Karl Karl

07/11/2009 16:54:00
Quote Anchor link
Jonathan schreef op 07.11.2009 16:41:
Als je het wilt perfectioneren zou je iets moeten inbouwen dat je niet twee keer hetzelfde krijgt. Klinkt wat abstract, dus maar even een voorbeeldje.

Waarom zou je dat willen? Lijkt mij niet logisch.
Misschien wil je iets nadrukkelijk zeggen, zoals bijvoorbeeld dit:
google!
google!
google!

Jonathan schreef op 07.11.2009 16:41:
Wat je zou willen:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
Google (http://www.google.com/)
http://www.google.com/
http://www.google.com/
http://www.google.com/
Aapje (aapje@aapje.nl)
aapje@aapje.nl

Dat lijkt mij helemaal raar, waarom moet wel vier keer die url er zijn?

Wat mij juist beter lijkt is om gewoon het helemaal door preg_replace te laten afhandelen, geen php code gebruiken. Dus dit:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
<?php
$string
= '<a href="http://www.google.nl/">Google</a>
<a href="http://www.phphulp.nl" target="_blank">PHPhulp</a>

<a target="_blank" href="http://www.phphulp.nl">PHPhulp</a>

<a href="http://www.google.nl/">Google dit!</a>

<a href="mailto:test1@dpmain.tld?subject=MailTo Comments&cc=test2@domain.tld&bcc=test3@domain.tld&body=The message\'s first paragraph.%0A%0aSecond paragraph.%0A%0AThird Paragraph.">Stuur mailtje</a>
'
;
$pattern = '/<a[^h]+href=(\'|")(?:mailto:)?(.*?)\1(?:.*?)>(?:">|\'>)?([^<\/]+)<\/a>/m';
$replacement = '$2 ($1)';
echo preg_replace($pattern, $replacement, $string);

/* Dit levert:
Google (http://www.google.nl/)
PHPhulp (http://www.phphulp.nl)

PHPhulp (http://www.phphulp.nl)

Google dit! (http://www.google.nl/)

Stuur mailtje (test1@dpmain.tld?subject=MailTo Comments&cc=test2@domain.tld&bcc=test3@domain.tld&body=The message's first paragraph.%0A%0aSecond paragraph.%0A%0AThird Paragraph.)
*/

?>

Zoals je ziet heb ik de regex ook wat aangepast, zodat de href niet direct na de a hoeft te komen.
Edit: Klein foutje in de regex verbeterd, volgens mij is die nu correct. Let wel op dat deze dus geen check doet of de url een valid url is. Hij pakt echt alles wat in de href staat, en alles wat in de tag staat. Verder werkt hij ook niet als er geen quotes (enkele of dubbele) om de url staan, dat vind ik geen valid html.

Edit2:
Er zaten volgens mij nog wat foutjes in. Nu is ie volgens mij echt perfect:
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php
$string
= <<<EOD
<a href="http://www.google.nl/">Google</a>
<a href="http://www.phphulp.nl" target="_blank">PHPhulp1</a>

<a target="_blank" href="http://www.phphulp.nl">PHPhulp2</a>
<a target="_blank" href='http://www.phphulp.nl'>PHPhulp3</a>

<a target="_blank" title="test >" href="http://www.phphulp.nl" title="test >">PHPhulp4 test</a>

<a href="http://www.google.nl/">Google dit!</a>

<a href="mailto:test1@dpmain.tld?subject=MailTo Comments&cc=test2@domain.tld&bcc=test3@domain.tld&body=The message\'s first paragraph.%0A%0aSecond paragraph.%0A%0AThird Paragraph.">Stuur mailtje</a>
EOD
;
$pattern = '/<a[^h]+href=(\'|")(?:mailto:)?(.*?)\1(?:.*?)>(?:">|\'>)?([^<\/]+)<\/a>/m';
$replacement = '$3 ($2)';
echo preg_replace($pattern, $replacement, $string);
/* Levert:
Google (http://www.google.nl/)
PHPhulp1 (http://www.phphulp.nl)

PHPhulp2 (http://www.phphulp.nl)
PHPhulp3 (http://www.phphulp.nl)

PHPhulp4 test (http://www.phphulp.nl)

Google dit! (http://www.google.nl/)

Stuur mailtje (test1@dpmain.tld?subject=MailTo Comments&cc=test2@domain.tld&bcc=test3@domain.tld&body=The message\'s first paragraph.%0A%0aSecond paragraph.%0A%0AThird Paragraph.)
*/

?>


Edit3:
Hier is de laatste, zoals je ziet match die nu ook url's zonder quotes. Het enige probleem nu nog: er mag dan verder niks meer na de href in de a tag staan :-(
Code (php)
PHP script in nieuw venster Selecteer het PHP script
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
<?php
$string
= <<<EOD
<a href="http://www.google.nl/">Google</a>
<a href="http://www.phphulp.nl" target="_blank">PHPhulp1</a>

<a target="_blank" href="http://www.phphulp.nl">PHPhulp2</a>
<a target="_blank" href='http://www.phphulp.nl'>PHPhulp3</a>

<a target="_blank" title="test >" href="http://www.phphulp.nl" title="test >'>PHPhulp4 test</a>

<a href="http://www.google.nl/">Google dit!</a>

<a href="mailto:test1@dpmain.tld?subject=MailTo Comments&cc=test2@domain.tld&bcc=test3@domain.tld&body=The message\'s first paragraph.%0A%0aSecond paragraph.%0A%0AThird Paragraph.">Stuur mailtje</a>

<a href=http://www.google.nl/>Google dit!2</a>

<a href="http://www.google.nl/" title="test >>>">Google dit!3</a>
EOD
;
$pattern = '/<a[^h]+href=(\'|"|)?(?:mailto:)?(.*?)\1(?:.*(?:\'|")>)?>?([^<\/]+)<\/a>/m';
$replacement = '$3 ($2)';
echo preg_replace($pattern, $replacement, $string);
?>

Gewijzigd op 01/01/1970 01:00:00 door Karl Karl
 
Elwin - Fratsloos

Elwin - Fratsloos

09/11/2009 08:57:00
Quote Anchor link
Thx voor de verbeteringen in de RegEx! :) That helps! :)

Moet de replace overigens wel door PHP laten doen, want er moet nog meer gebeuren met de hyperlink, behalve het op deze manier presenteren. Het is namelijk de bedoeling dat je niet naar http://www.google.nl/ gaat, maar naar http://www.domein.nl/nieuwsbrief/link/%CODE%, waardoor het systeem kan meten of er (en door welke ontvanger) op een link is geklikt.

Maar dat is natuurlijk geen probleem om in te bouwen.
 
Jonathan -

Jonathan -

09/11/2009 13:30:00
Quote Anchor link
@Karl: weet je zeker dat je mijn bericht goed gelezen hebt en de voorbeelden bekeken hebt (en ook nog alles snapt)? Het lijkt namelijk alsof dat niet zo is. Ik bedoelde: stel je heft een link "<a href="X">Y</a>" waarbij X = Y, dan is het overbodig om "Y (X)" neer te zetten, immers X = Y. Beter is dan om enkel "X" neer te zetten.
 



Overzicht Reageren

Get Adobe Flash player