webForumDet fria alternativet

wordwrap() efter man har parsat om egna taggar

PHP

6 svar · 285 visningar · startad av ThACRoW

Medlem sedan dec. 2001314 inlägg
Frågan#1

Nu ska vi se hur jag ska förklara detta...

Jo jag har en liten editor där man kan skriva in olika taggar, typ: [b]fet text[/b], och sen när man klickar submit så parsas det ju om till <b>fet text</b>.

Men nu kommer problet att jag vill använda wordwrap så att den gör ett radbyte ifall ett ord skulle överskrida visst antal tecken. Men när jag använder wordwrap() så ingår ju själva KODEN med i wrappnings-proccesen (fan va fint ord).

Så hur ska jag wrappa bara själva TEXTEN och inte koden, men sen ska all kod tillbaka igen ?? Hoppas nån förstår, jag har lite svårt för att förklara :r

Medlem sedan mars 20007 896 inlägg
#2

Skulle gissa på att det är fasansfullt mycket jobb att göra, men lite tips är att använda preg_match ()/preg_match_all (), strpos (), plus ett par till sträng-funktioner. Spara alla taggar och deras positioner i arrayer samtidigt som du lägger in tagg-fri text i en temporär variabel. Du kör sedan wordwrap () på den och lägger sedan in taggarna efter deras sparade positioner... Mycket jobb, som sagt.

Medlem sedan dec. 2001314 inlägg
#3

usch ja.. det låter så... men men det är väl bara å sätta igång.. tack för idén!

Medlem sedan dec. 2001314 inlägg
#4

Jag är inte så duktig på regexp:ar, så skulle du, eller någon annan, kunna hjälpa mig med detta:

$str = 'abcdefg<b>h</b>ijklmn<u>op</u>qrstuvwxyzåäö';

Hur ska jag nu med hjälp av preg_match, eller preg_match_all få ut en array som innehåller "<b>", "</b>", "<u>" och "</u>" ?

Medlem sedan dec. 2001314 inlägg
#5

Okej det va ju skit enkelt

preg_match_all ( "/(<[^>]+>)/", $str, $matches );

Medlem sedan dec. 2001314 inlägg
#6

Jag har nu slitit i runt 6 timmar och lyckats göra som jag har tänkt mig någolunda.

SPiN: Om det ändå vore så enkelt som du förklarade, men det var mycket, mycket mer komplicerat. T.ex efter man har gjort en wordwrap, så läggs det ju till en massa <BR>, och då stämmer ju inte positionerna man sparade längre. Sen när man ska lägga till koden igen, så får den ju inte krocka med <BR> taggarna, utan koden måste ju läggas till antingen före eller efter.

Men det återstår fortfarande ett problem. Det går inte använda flera instanser av samma kod, m.a.o.: Man kan bara använda [B]...[/B] en enda gång i strängen.

Kanske inte äns är någon mening att fråga här, eftersom mitt problem är ganska komplicerat ;)
Jag bifogar mitt 6-8 timmars hårda slit här iaf, om det nu kanske hjälper någon.

( Jag har använt < och > istället för [ och ], så att jag kan se resultatet med HTML )

<?
$str = 'abcdefg<b>h</b><u>ijklmnopqr</u>st<font color=red>uvwxyz</font>åäö';
$wrap = 20;

preg_match_all ( "/(<[^>]+>)/", $str, $matches );

for ( $i = 0; $i < count ( $matches[1] ); $i++ )
{
	$positions[] = strpos ( $str, $matches[1][$i] );
	$length[] = strlen ( $matches[1][$i] );

	unset ( $subtract );
	for ( $j = 0; $j < $i; $j++ ) $subtract += $length[$j];

	if ( $i > 0 ) $positions2[] = strpos ( $str, $matches[1][$i] ) - $subtract;
	else $positions2[] = strpos ( $str, $matches[1][$i] );
}

$clean_str = preg_replace ( "/(<[^>]+>)/", "", $str );
$clean_str = wordwrap ( $clean_str, $wrap, "<BR>", 1 );
$output_str = $clean_str;

for ( $i = 0; $i < count ( $matches[1] ); $i++ )
{
	$newline_matches = ( int ) ( ( strlen ( substr ( $str, 0, $positions2[$i] ) ) / $wrap ) );
	$output_str = substr_replace ( $output_str, $matches[1][$i], $positions[$i] + $newline_matches * 4, 0 );
}
?>
Medlem sedan dec. 2001314 inlägg
#7

Hej igen... skulle bara meddelada att PHP är inte alltid det bästa i sådana här situationer ;)
Jag har löst mitt problem med lite CSS. Det känns ganska jobbigt att mitt problem jag har hållt på med i många många timmar ersätts med 2 rader CSS kod :(

Men men, det funkar nu. Även om detta är PHP forumet, så tycker jag det passar in här för folk som har samma problem och försökt lösa det med hjälp av php :)

<TABLE WIDTH=50 STYLE="table-layout: fixed;">
<TR>
    <TD STYLE="word-wrap: break-word; width: 100%;">
    blablablablablablablablablablablablablablablablablablab
    </TD>
</TR>
</TABLE>
258 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
119 ms — deklarationer (db)
0 ms — hämta statistik (cache)
134 ms — hämta tråd, inlägg och bilagor (db)
122 ms — ändringar (db)