Wyrazenie regularne a kolorowanie wybranego tekstu w html (z pominieciem tagow)

0

Witam
problem wyglada nastepujaco:
mam kod html (chociaz niekoniecznie, bo moze byc np czysty tekst) i chce w nim zmienic wszystkie wystapienia "div", ale tylko takie ktore nie sa tagiem (czyli nie moga sie znajdowac pomiedzy znakami <> czyli musza znajdowac sie pomiedzy ><).
z regexem dopiero zaczynam... na razie splodzilem cos takiego:

((?<=>)[^<]*?)
(div)
([^>]*?(?=<))

pozniej zamieniam $2 na wybrany przeze mnie string.
i teoretycznie by mi wystarczylo bo swoje zadanie spelnia. jest jedno "ale"...:
jesli na poczatku stringa pojawi sie "div" niepoprzedzony ">" to to wyrazenie zostanie pominiete. jak to rozwiazac?
myslalem nad uwzglednieniem poczatka i konca stringa w wyrazeniu ale z regex'em mam stycznosc od wczoraj wiec mi nie wychodzi.

dzieki z gory
pozdrawiam

0

Jeżeli to wszystko ma siędziać za pomocą PHP to może uda mi się Tobie pomóc. Słyszałeś o funkcji ereg(); ? Jest ona w takich przypadkach przydatna.
Można jej użyć w ten sposób:
Kod PHP

<?php // $text jest naszą zmienną z treścią z DIV-ami
// $warunek jest zmienną z wzorem do szukania "div" w $text
// $arr jest zamienną do której zapisywany jest ciąg znaków pasujących do wzoru
while(ereg($warunek, $text, $arr))
{
  str_replace($arr[0], "nowy_text", $text);
}
?>

Niestety nie mam teraz czasu ale postaram się coś wymyśleć w wolnej chwili. Jak coś mi się uda zrobić to napisze.
A te div ma usuwać czy zamieniać na konkretny tekst?

0

div ma sie zamieniac na konkretny tekst (po bokach dodawac znaczniki).
po prostu chce pokolorowac wyniki wyszukiwania na stronie.
widzialem ze ludzie to robia zwyczajnie dodajac znaczniki po obu stronach szukanej frazy (tak jak ja chce to zrobic) ale jest to robiione "na slepo"...
czyli jeli ktos wpisze jako fraze wyszukiwania np "ref" to ta tandetna metoda uwzgledni takze "ref" w "href" wewnatrz tagow html:

       <a href="http://4programmers.net/">

a to spowoduje kompletny zamet w kodcode>a to spowoduje kompletny zamet w kodzie:
<a href="http://4programmers.net/">

dzis zauwazylem ze moje wyrazenie tez sie nie nadaje: nie znajduje kazdej frazy z osobna. naprawde juz nie wiem jak mam to rozwiazac.
chyba zeee...:
 1. bede pobieral tekst pomiedzy znakami '>' a '<' - czyli cos co na pewno nie jest tagiem html tylko trescia strony.
 2. ten tekst traktowal regexem a potem skladal wszystko do kupy.

jakies pomysly, podpowiedzi?
w php pisze od kilku dni wiec nie znam funkcji typu ereg() (w sensie nie wiem o ich istnieniu, z uzyciem problemu nie ma), jesli sa inne ktore moga sie przydac bede wdzieczny za info :)
0

Ja rozwiązałbym to dwustopniowo - najpierw zamienił wszystkie "div" które nie są znacznikami - czyli faktycznie znajdują się pomiędzy > oraz <, a potem ewentualnie znalazł i zamienił wszystkie "div" znajdujące się na początku i lub na końcu wiersza.

Czyli przykładowo:

$zmienna = "div<a>div</a><div>test</div>div";
print_r($zmienna); echo "\n\n";
$zmienna = preg_replace('/>([^<]*?)(div)(.*?)</', '>$1zamienione$3<', $zmienna);
print_r($zmienna); echo "\n\n"; // div<a>zamienione</a><div>test</div>div
$zmienna = preg_replace('/(^div)|(div$)/', 'zamienione', $zmienna);
print_r($zmienna); echo "\n\n"; // zamienione<a>zamienione</a><div>test</div>zamienione
// chyba działa: ale nie gwarantuję sukcesu, nie jestem ekspertem od regexpów
0

no wlasnie problem jest z tym wyrazeniem regularnym:
>([^<]*?)(div)(.*?)<
bo dla jednego "div" bedzie ok. taki string:

<a>div</a>
<div>test</div>

zostanie zamieniony na:

<a>zamienione</a>
<div>test</div>

niby ok. ALE... taki string (gdzie div'ów pomiedzy znacznikami jest wiecej):

<a>div tu troche tekstu div</a>
<div>test</div>

zostanie zamieniony na:

<a>zamienione< tu troche tekstu div/a>
<div>test</div>

trzeba opracowac albo lepsze wyrazenie albo rozwiazac to inaczej..

a no super :/
wlasnie znalazlem idealne wyrazenie (dzialajace w programie Expresso ktorego uzywam do testowania):(?<=<[^<>]*>.*?)div(?=[^>]*?<) ale nie chce dzialc w php :/
otrzymuje:Warning: preg_replace() [function.preg-replace]: Compilation failed: lookbehind assertion is not fixed length at offset 15 in {...}

0

wczesniej szukalem, szukalem i nie znalazlem... a tu prosze, pod nosem:
http://krijnhoetmer.nl/stuff/php/word-highlighter/

$output = preg_replace(
  "/(>|^)([^<]+)(?=<|$)/esx",
  "'\\1' . str_replace('" . $keyword . "', '<b>" . $keyword . "</b>', '\\2')",
  $input
);

jeszcze nie rozumiem do konca jak to dziala ale grunt ze dziala :)
dzieki wszystkim za pomoc :)

1 użytkowników online, w tym zalogowanych: 0, gości: 1