webForumDet fria alternativet

RegExp: Korta ner länkar

PHPur PHP

2 svar · 511 visningar · startad av Peeer

PeeerMedlem sedan mars 20025 907 inlägg
#1

Afton!
Använder följande funktion för att bryta långa ord:

<?php
function ShortWord($text,$length) 
{
	$text = preg_replace ("/([^\s]{".$length.",})/e", "''.wordwrap('\\1', ".$length.", ' ', 1).''", $text);
	return $text;
}?>

Den fungerar prima, men nu vill jag modifiera lite. Om strängen jag skickar in består av en länk så kapas den mitt i om den är för lång, det är dumt! Däremot får gärna det som är mellan <a> och </a> brytas.

Dvs

//skickar jag in följande i den nuvarande funktionen
echo ShortWord('<a href="http://www.google.se">Goooooogle!</a>',5)
//så får jag ut
<a href= "htt p://w ww.go ogle. se"> Goooo oogle !</a>
//Det resultat jag vill ha ser ut såhär:
<a href="http://www.google.se">Goooo oogle !</a>

Hur fixar jag det?
Om det förenklar så ser länkarna alltid ut precis som mitt exempel ovan. Inga konstiga attribut eller liknande att ta hänsyn till.

stevenetMedlem sedan juni 20001 251 inlägg
#2

Hej!

Eftersom ingen annan vågat sig på det hela... Wordwrappar inte url:er, str_replace används för att lura wordwrap-funktionen. Blir inte helt som du tänkt (beroende på att str_replace lägger till två tecken), men tillräckligt nära?

<?php
function ShortWord($text, $length)
{
   $text = str_replace('">', '"> ', $text);
   $text = str_replace('</a>', ' </a>', $text);
    
  $pattern = '/(^|\s)(?!(?:http:\/\/(?:www\.)?|www\.))([\w??????!?.,-]{'. $length .',})(\s|$)/e';
  $text =  preg_replace( $pattern, '"$1".wordwrap( "$2", $length, " ", true )."$3"', $text );
      
  $text = str_replace('"> ', '">', $text);
  $text = str_replace(' </a>', '</a>', $text);
    
  return $text;
}

echo ShortWord('<a href="http://www.google.se">Goooooogle!</a> Texttexttexttexttext. <a href="http://www.aftonbladet.se" target="_blank">Aftonbladet</a>',5);

?>
PeeerMedlem sedan mars 20025 907 inlägg
#3

Verkar fungera fint! Hittade dock en liten bugg, om det är en br-tagg precis innan ett för långt ord så bryts inte ordet. Löste det genom att lägga till ett blanksteg precis efter alla sådana taggar

echo ShortWord('<br />12345678901234567890 <a href="http://www.google.se">Goooooogle!</a> Texttexttexttexttext. <a href="http://www.aftonbladet.se" target="_blank">Aftonbladet</a>',5);

Tack för hjälpen!

133 ms totalt · 3 externa anrop · v20260731065814-full.363dfaf6
0 ms — hämta forumlista (cache)
0 ms — hämta statistik (cache)
130 ms — hämta tråd, inlägg och bilagor (db)