webForumDet fria alternativet

Korta ner synligt länknamn

Webbutveckling

11 svar · 823 visningar · startad av lillebror

Medlem sedan apr. 20041 597 inlägg
Frågan#1

Hej,

Jag har ett regexp-uttryck som känner av ett antal länk-taggar i mitt forum:

$text = preg_replace("/\[URL]((https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)*)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?\[\/URL\]/ie","'$1'!='' ?'<a href=\"$1$3$5$6\" target=\"$target\">$1$3$5$6</a>':'<a href=\"http://$3$5$6\">$3$5$6</a>'",$text);

Nu har jag upptäckt att texten i länken som skapas kan bli alldeles för lång och påverka designen negativt. I mitt fall är det ju variablerna $3, $5 och $6 som kommer synas i länknamnet. Kan man på något ange max antal tecken som skall skrivas ut?

Medlem sedan dec. 20025 483 inlägg
#2

Hej!

Testa

$text = preg_replace("/\[URL]((https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)*)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?\[\/URL\]/ie","'$1'!='' ?'<a href=\"$1$3$5$6\" target=\"$target\">$1$3$5$6</a>':'<a href=\"http://$3$5$6\">' . (strlen('$3$5$6') > 29 ? (substr('$3$5$6',0,13).'...'.substr('$3$5$6',-13)) : '$3$5$6') . '</a>'",$text);

Ovan är 29 valt som magiskt tal. Vill du justera detta måste du även ändra parametrarna för substr().

Medlem sedan apr. 20041 597 inlägg
#3
(strlen('$3$5$6') > 29 ? (substr('$3$5$6',0,13).'...'.substr('$3$5$6',-13)) : '$3$5$6')

Hur tolkar jag strängen? Om $3$5$6 är fler än 29 tecken så förkortas $3$5$6 till 13 tecken. Vad händer sen där du angett -13?

Medlem sedan dec. 20025 483 inlägg
#4

(uttryck) ? (om uttryck sant) : (om uttryck falskt);

-13 innebär 13 tecken från slutet av strängen.

Medlem sedan apr. 20041 597 inlägg
#5
(substr('$3$5$6',0,13).'...'.substr('$3$5$6',-13))

Det var mest denna kodsnutt som jag inte hängde med på. I substr talar du om att alla tecken från 0 till 13 ska med. Sen kommer "...". Därefter substr som ska börja på position -13? Vad finns på position -13? :q

Medlem sedan dec. 20025 483 inlägg
#6

Det trettonde tecknet från slutet. Det sista substr()-anropet säger alltså: "Hämta delsträngen vars första tecken finns på den trettonde positionen från slutet i '$3$5$6' och vars sista tecken är det sista tecknet i '$3$5$6'".

Medlem sedan apr. 20041 597 inlägg
#7

Nu när jag testkörde uttrycket och laborerade lite så ser jag exakt vad alla variabler gör. Tack Peter! :)

Medlem sedan apr. 20041 597 inlägg
#8

Hej Peter!

Jag upptäckte att jag fått ett parsefel i min funktion som gör om textlänkar till klickbara länkar. Detta tror jag härrör sig till uppdateringen som kortar ner länkarna om de har för många tecken.

Detta är felmeddelandet jag får i inlägget:

Parse error: syntax error, unexpected '.' in /xxx/include.function.php(547) : regexp code on line 1

Ytterligare ett felmeddelande i inlägget:

Fatal error: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Failed evaluating code: 'http://'!=''?'<a href="http://www.luftfartsstyrelsen.se/upload/Luftfartsstyrelsen/Rapporter/Energiskattedir_uppdrag2004_rapport_041223_slutlig.pdf&quot; target="_blank">'.stripslashes('LFVs utredning avseende bränsleskatt').'</a>':'<a href="http://www.luftfartsstyrelsen.se/upload/Luftfartsstyrelsen/Rapporter/Energiskattedir_uppdrag2004_rapport_041223_slutlig.pdf">'..'</a>' in /xxx/include.function.php on line 547

Så här ser min nuvarande funktion ut:

$text = preg_replace("/(?<=^|\s)((http?|https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)+)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?(?=\s|$)/ie","'$1'!=''? '<a href=\"$1$3$5$6\" target=\"$target\">'. (strlen('$1$3$5$6') > 77 ? (substr('$1$3$5$6',0,65).'...'.substr('$1$3$5$6',-13)) : '$1$3$5$6') .'</a>':'<a href=\"http://$3$5$6\">'. (strlen('$3$5$6') > 29 ? (substr('$3$5$6',0,13).'...'.substr('$3$5$6',-13)) : '$3$5$6') .'</a>'",$text);

$text = preg_replace("/\[URL=((https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)*)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?\]([^\]\[]+)\[\/URL\]?/ie","'$1'!=''?'<a href=\"$1$3$5$6\" target=\"$target\">'.stripslashes('$7').'</a>':'<a href=\"http://$3$5$6\">'..'</a>' ",$text);
 
$text = preg_replace("/\[URL]((https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)*)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?\[\/URL\]/ie","'$1'!='' ?'<a href=\"$1$3$5$6\" target=\"$target\">$1$3$5$6</a>':'<a href=\"http://$3$5$6\">'.(strlen(stripslashes('$7')) > 29 ? (substr(stripslashes('$7'),0,13).'...'.substr(stripslashes('$7'),-13)) : stripslashes('$7')) .'</a>'",$text);

Så här ser URLen ut som orsakar felet:

V.KLAMMERURL=http://www.luftfartsstyrelsen.se/upload/Luftfartsstyrelsen/Rapporter/Energiskattedir_uppdrag2004_rapport_041223_slutlig.pdf\]LFVs utredning avseende bränsleskatt[/URLHKLAMMER

Medlem sedan apr. 20041 597 inlägg
#9

Upptäckte att länken gjordes om korrekt till en klickbar länk när jag manuellt gick in i databasen och tog bort URL-klamrarna runt länktexten. Punkterna lades till korrekt då länknamnet var långt.

Det är något annat som spökar i regexputtrycket.

Medlem sedan dec. 20025 483 inlägg
#10

Jag kan inte säga säkert vad som orsakar detta. Däremot tror jag inte att vissa citationstecken behövs; för att ta ett exempel (den första preg_replace()-raden omskriven):

$text = preg_replace(
  "/(?<=^|\s)((http?|https?|ftps?):\/\/)?(([-_a-zA-Z0-9]+\.)+)([a-zA-Z]{2,6})(\/[^\]\[\s]*)?(?=\s|$)/ie",
  '$1'!='' ?
    ('<a href=\"$1$3$5$6\" target=\"$target\">' . (strlen('$1$3$5$6') > 77 ?
							(substr('$1$3$5$6',0,65).'...'.substr('$1$3$5$6',-13)) :
							'$1$3$5$6') . '</a>')
           :
    ('<a href=\"http://$3$5$6\">' . (strlen('$3$5$6') > 29 ? (substr('$3$5$6',0,13).'...'.substr('$3$5$6',-13)) : '$3$5$6') .'</a>'),
  $text);
Medlem sedan apr. 20041 597 inlägg
#11

Felet är helt och hållet mitt :)

Upptäckte att det fanns en punkt för mycket på ett ställe där man bryter av textsträngen för att stoppa in ett villkor av något slag. Det har nu löst sig! :birp

Medlem sedan dec. 20025 483 inlägg
#12

Jaha, där ser man (y)

270 ms totalt · 4 externa anrop · v20260731065814-full.6fe65c25
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
129 ms — ändringar (db)