Avatar billede jong Nybegynder
23. juli 2002 - 20:08 Der er 12 kommentarer og
1 løsning

indsæt tag omkring ord - ikke i tag

Jeg skal indsætte en tekst før og efter et eller flere ord i en længere tekst, som indeholder html-tags. Ord der optræder i tags'ne skal der ikke indsættes omkring.

Eksempel:
Jeg skal indsætte <span class='speciel'> og </span> hhv. før og efter 'name' i teksten:

"Insert your name: <input type='text' name='name' value=''> Names are needed to apply."

Jeg skal markere det første 'name' og 'Name' i 'Names' til sidst, men ikke de to 'name' i taggen.

Jeg skal enten lave det i javascript eller PHP, og en regular expression foretrækkes.

Mvh.
Jon Gaarsmand
Avatar billede teaspoon Nybegynder
24. juli 2002 - 01:46 #1
i php:

$str = "Insert your name: <input type='text' name='name' value=''> Names are needed to apply.";

$str = preg_replace("/name(?=s|:)/i", "<span class='speciel'>\\0</span>", $str);

vil virke i dit specifikke eksempel. Den matcher nemlig name efterfuldt af et s eller et :

ved ikke om du ønsker en mere fleksibel løsning som gør det alle steder der står name uden for et html tag?
Avatar billede jong Nybegynder
24. juli 2002 - 10:27 #2
Det skal være en helt generel løsning: ikke marker noget mellem < og >
- desuden tror jeg dit vil markere det andet name i taggen (det efter =-tegnet)
Avatar billede teaspoon Nybegynder
24. juli 2002 - 12:53 #3
hvorfor tror du det? det er da ikke efterfulgt af et s eller :

Jeg kan ikke umiddelbart se nogen simpel måde at checke om name står inden for <>. Denne funktion klarer det dog, omend den er lidt længere.

function highlight_name($str) {
  $newstr = "";
  preg_match_all("/[^<>]+|<.*?>/", $str, $matches);
  foreach($matches[0] as $part) {
    if (substr($part, 0, 1) != "<") $newstr .= preg_replace("/name/i", "<span class='speciel'>\\0</span>", $part);
    else $newstr .= $part;     
  }
  return $newstr;
}

$str = "Insert your name: <input type='text' name='name' value=''> Names are needed to apply. name name lblalbanamelkmbfl";
$str = highlight_name($str);
Avatar billede jong Nybegynder
24. juli 2002 - 13:23 #4
Sorry, den er heller ikke hensigtsmæssig nok - det skal være en enkelt regular expression, med preg_replace eller lignende.
Avatar billede teaspoon Nybegynder
24. juli 2002 - 13:39 #5
Hvad er det helt nøjagtig du vil opnå. Den virker, er det ikke det vigtigste? Men hvis du gerne vil have en på kun 1 linie, går du da bare i gang :)
Avatar billede jong Nybegynder
24. juli 2002 - 13:43 #6
Det er også et spørgsmål om hastighed, preg_match_all, foreach løkke og preg_replace tager 10-100 gange længere tid (er testet) end end preg_replace. Derfor!
Avatar billede teaspoon Nybegynder
24. juli 2002 - 14:10 #7
på min computer tager det ~0.0005 sekunder at udføre den funktion. Det er godt nok også lang tid :)

sammenlignet med en enkelt preg_replace som tager ~0.00025 sekunder.

ja, det er dobbelt så lang tid, men hvis det nu er den eneste løsning. Jeg kan ikke udmiddelbart komme på noget smartere, men måske du er heldig det kommer en regexp haj forbi :)
Avatar billede jong Nybegynder
24. juli 2002 - 14:14 #8
Den funktion som du har lavet giver ikke noget resultat heller... prøv selv
Jeg søger efter "name" i:
Klik på knappen  NAME Opdater, eller prøv igen senere.

<a value="name" name="tt">
Hvis du har skrevet name sidens
NaMeadresse i adresselinjen, skal du name
Avatar billede teaspoon Nybegynder
24. juli 2002 - 14:33 #9
Den virker upåklageligt her. Prøv at se i koden til siden. html tags kan jo ikke ses normalt!

vær også opmærksom på at:
if (substr($part, 0, 1) != "<") $newstr .= preg_replace("/name/i", "<span class='speciel'>\\0</span>", $part);
Avatar billede teaspoon Nybegynder
24. juli 2002 - 14:33 #10
...er en lang linie
Avatar billede jong Nybegynder
24. juli 2002 - 14:52 #11
Tjaeh, teaspoon.
Din funktion er god nok, men jeg vil lade spørgsmålet stå åbent lidt endnu; det ku jo være der dukkede en reg.exp. op som klarede det hele på een gang, så jeg også kunne gøre det med clientside javascript.
Avatar billede teaspoon Nybegynder
24. juli 2002 - 14:56 #12
du skal da gøre det serverside så vidt muligt. Du kan jo ikke være sikker på at browseren understøtter javascript og regexp etc.
Avatar billede jong Nybegynder
24. juli 2002 - 15:03 #13
Har normalt samme princip - men til dette formål er det en fordel med client side, da det er optil 20 forskellige ord der skal markeres i en 100 kb fil, og genloade den synes jeg er måske lidt voldsomt.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester