[php] highlight + replace probleem

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
Ik heb een aardig ingewikkeld probleem, kan het ook niet eens kwijt in het onderwerp.

Ik heb een functie gemaakt die bepaalde woorden highlight, binnen een string.
Dat werkt allemaal prima.
Maar nu heb ik een cms achter de site hangen, en alle teksten op die pagina's staan in de database.

Wanneer ik dan een bepaald woord highlight bijv. "blaat"
zet iet overal een span omheen (logisch )
maar nu heb ik een img tagje
like this:

code:
1
[img]"blaatnaam.jpg"[/img]

dan maakt ie hier van:
code:
1
[img]"<span[/img]blaat</span>naam.jpg" height="200" width="200">

Hoe kan ik dit oplossen dmv. php? Hij moet dus de img tag negeren!

Dit is trouwens de highlight functie:
PHP:
4
5
6
7
8
9
10
11
12
13
14
15
function HighLight($text,$woord) { 
    $text = str_replace($woord,"<span style='background-color: yellow'>".$woord."</span>",$text); 
    return $text; 
} 

//haal string op uit url en plaatst het in de highlight functie 
$nbericht =  HighLight($nbericht,$HTTP_GET_VARS['s'])
; 
$nbericht =  HighLight($nbericht,ucfirst($HTTP_GET_VA
RS['s'])); 
$nbericht =  HighLight($nbericht,strtoupper($HTTP_GET
_VARS['s']));

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Kijk eens naar xslt, hier staat volgens mij wel een leuke replace functie. Ook aan deze link heb je misschien wel wat, of aan P&W FAQ - Regular expressions.

[ Voor 7% gewijzigd door chris op 24-01-2004 00:14 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

user643, ben je er al uit?

heb ff zitten denken: misschien kun je eerst bepalen waar $woord staat en vervolgens checken of enkele tekens ervoor bijvoorbeeld "<img " voorkomt, of enkele tekens erna ".jpg" of iets dergelijks, en daarna eventueel de str_replace uitvoeren

ben wel benieuwd hoe je dit oplost :)

Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
Zoiets had ik ook in gedachten, maar het uitvoeren ervan lukt nog niet!

Iemand anders gaf dit als een mogelijke optie:
PHP:
4
$text = preg_replace("/([:space:]+)" . preg_quote($woord) . "([:space:]|\.)/Usi", "\1<span style='background-color: yellow'>" . $woord . "</span>\2", $tekst);

hier kijkt ie of er spaties om het woord staan.
alleen werkt ie niet :(

geeft deze error: Warning: Compilation failed: POSIX named classes are supported only within a class at offset 1 in c:\phpdev\www\lba\config.php on line 16


Maar ik ga morgen weer verder!
Rise and Shine...

suggesties zijn nog steeds welkom!

[ Voor 78% gewijzigd door user643 op 24-01-2004 00:55 ]


Acties:
  • 0 Henk 'm!

  • X-Lars
  • Registratie: Januari 2004
  • Niet online

X-Lars

Just GoT it.

hey, die van mij is geniaal hoor :+

Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
Yes hij werkt nu, hij hightlight alles behalve wat tussen tags staat "<>", alleen op een klein detail na.


Nu het probleem is dat ie mijn letters ook aanpast, hij maakt ze lowercase. Ik heb al zitten klooien met eregi_replace functie maar het lukt niet!

PHP:
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
32
33
34
35
36
37
function HighLight($text,$woord) { 
    $keys_arr = "/$woord/si";
    $old_gt = 0;  // Last > position in the text
    $old_lt = 0;  // Last < position in the text
    $text = ' '.$text;
    $res_text="";
    while((($cur_lt = strpos($text, '<', $old_gt+1)) !== false)&&
          (($cur_gt = strpos($text, '>', $cur_lt+1)) !== false))
    {
      $tmp_lt = strpos($text, '<', $cur_lt+1);
      while (($tmp_lt !== false) && ($cur_gt > $tmp_lt))
      {      
        $cur_lt = $tmp_lt;
        $tmp_lt = strpos($text, '<', $cur_lt+1);
      }
      $res_text.= preg_replace($keys_arr,"<span style='background-color: yellow'>".$woord."</span>",substr($text, $old_gt, ($cur_lt-$old_gt)));
      $res_text.= substr($text, $cur_lt, ($cur_gt-$cur_lt));
      $old_gt = $cur_gt;
      $old_lt = $cur_lt;
    }  
    $res_text.= eregi_replace($keys_arr,"<span style='background-color: yellow'>".$woord."</span>",substr($text, $cur_gt));
    $text = trim($res_text);

return $text;
}

//aanroepen highlight functie verderop in de pagina

$woord = $HTTP_GET_VARS['s'];
if (!$woord == "") {
$nbericht = HighLight($nbericht,$woord);

//$nbericht = Highlight($nbericht,ucfirst($woord));
}

Acties:
  • 0 Henk 'm!

  • Alex
  • Registratie: Juli 2001
  • Laatst online: 20-08 21:38
Onze eigen drm heeft een gigantisch mooie RegExp-pagina online gezet, kijk er een naar:
http://gerard.yoursite.nl/got/regex-tut/reference.html

[ Voor 5% gewijzigd door Alex op 24-01-2004 13:49 . Reden: typo ]

Deze post is bestemd voor hen die een tegenwoordige tijd kunnen onderscheiden van een toekomstige halfvoorwaardelijke bepaalde subinverte plagiale aanvoegend intentioneel verleden tijd.
- Giphart


Acties:
  • 0 Henk 'm!

  • Rotjeknor
  • Registratie: April 2001
  • Laatst online: 01-04-2023
Ik heb laatst hetzelfde gemaakt, op een iets andere manier dan jij. Ik split eerst de tekst naar een array, waarbij ik tijdens het splitten bijhoudt of het om een tag gaat of niet. Daarna loop ik door het array heen om de tekst die geen tag heeft te highlighten. Daarna zet ik het array weer om naar een string.

Scheelt opzich weinig met jouw methode, ik vond het iig wel leuk jouw oplossing te zien.

Ook Knor is aangestoken met het ligfietsvirus!


Acties:
  • 0 Henk 'm!

  • ACM
  • Registratie: Januari 2000
  • Niet online

ACM

Software Architect

Werkt hier

Zo doen we het hier op GoT ongeveer trouwens:
[rml]chem in "[ php/preg] higlighten woorden, niet in <..."[/rml]

Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
thnx ik ga het ff proberen!

Acties:
  • 0 Henk 'm!

  • Michali
  • Registratie: Juli 2002
  • Laatst online: 29-05 22:54
PHP:
1
2
3
4
5
function HighLight(&$text,$woord) { 
    $text = str_replace($woord,"<span style='background-color: yellow'>".$woord."</span>",$text); 
} 

HighLight($nbericht, "woord")


Scheelt een aantal tekens en wat snelheid (minimaal mischien, maar toch).

Noushka's Magnificent Dream | Unity


Acties:
  • 0 Henk 'm!

  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 17-09 13:27
Michali schreef op 24 januari 2004 @ 15:01:
PHP:
1
2
3
4
5
function HighLight(&$text,$woord) { 
    $text = str_replace($woord,"<span style='background-color: yellow'>".$woord."</span>",$text); 
} 

HighLight($nbericht, "woord")


Scheelt een aantal tekens en wat snelheid (minimaal mischien, maar toch).
Uhm, het gaat hier toch om dat ie niet de woorden aanpakt als ze tussen < en > staan, hoe lost jouw functie dit dan op :?

[ Voor 9% gewijzigd door LinuX-TUX op 24-01-2004 15:06 ]


Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
de functie van ACM werkt prima, alleen als ik een var aan de url meegeef bijv: s=blaat
dan pakt hij puur in de tekst blaat en dus niet Blaat of BLAAT

Acties:
  • 0 Henk 'm!

  • LinuX-TUX
  • Registratie: December 2003
  • Laatst online: 17-09 13:27
wel eens PHP.net nagelopen over soortgelijke functies?

http://nl3.php.net/manual/en/function.eregi-replace.php
(PHP 3, PHP 4 )

eregi_replace -- replace regular expression case insensitive
alstublieft en suc6

[ Voor 27% gewijzigd door LinuX-TUX op 24-01-2004 16:39 ]


Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
Ha eindelijk heb ik hem:

PHP:
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
function HighLight($text,$woord) { 
    $keys_arr = "/$woord/si";
    $old_gt = 0;  // Last > position in the text
    $old_lt = 0;  // Last < position in the text
    $text = ' '.$text;
    $res_text="";
    while((($cur_lt = strpos($text, '<', $old_gt+1)) !== false)&&
          (($cur_gt = strpos($text, '>', $cur_lt+1)) !== false))
    {
      $tmp_lt = strpos($text, '<', $cur_lt+1);
      while (($tmp_lt !== false) && ($cur_gt > $tmp_lt))
      {      
        $cur_lt = $tmp_lt;
        $tmp_lt = strpos($text, '<', $cur_lt+1);
      }
      $res_text.= preg_replace($keys_arr,"<span style='background-color: yellow'>\\0</span>",substr($text, $old_gt, ($cur_lt-$old_gt)));
      $res_text.= substr($text, $cur_lt, ($cur_gt-$cur_lt));
      $old_gt = $cur_gt;
      $old_lt = $cur_lt;
    }  
    $res_text.= eregi_replace($keys_arr,"<span style='background-color: yellow'>\\0</span>",substr($text, $cur_gt));
    $text = trim($res_text);

return $text;
}


de "<span style='background-color: yellow'>\\0</span>" deed het em!!

Bedankt allemaal!

Acties:
  • 0 Henk 'm!

  • chris
  • Registratie: September 2001
  • Laatst online: 11-03-2022
Maar hoe ga je dit nu oplossen als bijvoorbeeld <b>tekst</b> wordt gebruikt? Of als er gequote tekst wordt gebruikt? Dan zou je imho wel kunnen highlighten.

Acties:
  • 0 Henk 'm!

  • user643
  • Registratie: Februari 2002
  • Laatst online: 03-09 08:18

user643

Sweet Surrender

Topicstarter
dat maakt niet uit! Werkt ook!
Pagina: 1