Jag skulle behöva få lite hjälp med att få ordet "byt" och "byta" att färgas röda även om de ligger i början av ett annat ord, t ex byteshandel eller bytarhörna. men endast ordet byt och byta ska färgas. Det är alltså alla utom de som ligger inne i HTML-taggar som skall hittas? misstänker nästan att det där är en sån grej som är klumpigt att göra mha. regexp:s. Så, nu verkar jag ha fått till det i PHP: Ett tappert försök med en liten funktion i VB... Använde den kod som Per Persson postade och försökte översätta till VB själv. Nån som förstår vad som är fel? Du har glömt en vänsterparentes. Sedan används väl $n för referens i ersättningssträngen? Jag vet inte ifall du har kört koden själv, men jag får "out of memory" när jag kör den. Vad är det i koden som gör att den får slut på minnet? Pröva följande... Nepps... Blir fortfarande Out of memory... Inte borde det väl bli det? eller stämmer inte erat förslag på pattern? Jag hade prövat PHP-koden, och hade glömt bort att jag hade tillgång till ASP/VBS. Den där bryter länkar, och det fick den ju inte göra... Ok, nu har jag en lite enklare variant av pattern som fungerar med VBScript... Absolut ingen dumm idé. Tackar för hjälpen hittils. Testa den igen, den är uppdaterad sedan det där mönstret... Ok, nu tror jag att jag har kommit fram med ett ännu bättre mönster... Ok, nu har jag en som fungerar ännu bättre, men dock är det så att mönstret inte fungerar i VBScript... Har ändrat skriptet på http://inet.bluerange.se/inta03pepe/regexp.asp. Pröva det igen! Per, Asch... jag är rätt nöjd med lösningen som jag fick förut och som jag skrev om lite... tackar så mycket. Brukar alltid föreslå http://www.regular-expressions.info för de förklarar allt så ett snabbt och enkelt sätt samt att det finns några tutorials etc... Det går om man skulle kunna använda ett mer avancerat uttryck som stödjer Lookaround fullt ut... Jag hittade ett nytt regexp för PHP: Det där mönstret hänger sig inte i mitt testprogram, dock skrivet i VB.NET... Det gjorde det tydligen under PHP också... Det är problem om strängen börjar med en tagg. *suck* Ja, det är problem där...Färga valda ord?
Jag hämtar upp texten ur databasen och vill därför kunna lägga in länkar såsom Länk utan att länken förstörs också. så alltså ska alla ord emd "byta" eller "byt" i början men som har en punkt i sig, ska alltså inte röras.
Någon som kan lösa problemet?Sv: Färga valda ord?
Nu kan jag inte ASP:s mönstersyntax, men så här ser det ut i Perl (preg_... i PHP):
/((^|>)[^<]*?)(byta?)/i
(sista i:et för "case-independent")
De fetmarkerade texterna kommer att hittas av hela mönstret:
<b>Skall vi byta</b> grejer, <span class="byta"><b>skall vi byta</b> grejer med varann?<br><b>Nu kan vi byta</b>.
Edit:
Insåg just nu att mönstret kommer att få problem om man har t.ex. koden "<p>Bytt är bytt och kommer aldrig igen.</p>"
Det första "Byt" hittas, men inte det andra (tror jag).Sv: Färga valda ord?
Men om inget annat så kan du ju gå igenom texten "för hand" och hålla reda på att du har jämt lika många < och > och i så fall så fifflar du om ordet vid match, annars gör du inget..Sv: Färga valda ord?
<?
$text = 'Jag vill byta1 grejer, du skall byta3 grejer, han måste byta4 grejer? Hon borde byta5 grejer. Fisken bytte färg.';
$tag = '<[^>]*>';
$non_tag = '[^<]*?';
$re = "#(({$tag}|{$non_tag})*?)(byta?)#";
$newtext = preg_replace($re, '\1<span style="color: red">\3</span>', $text);
echo "<p>$newtext</p>";
?>
Översättningen till VB borde vara ganska enkel efter vad jag ser på http://msdn.microsoft.com/library/default.asp?url=/library/en-us/script56/html/reconquantifiers.asp med följande sidor. Men för säkerhets skull överlåter jag det åt någon som behärskar det språket bättre.
Sv: Färga valda ord?
Function BytaText(sText)
Dim objRegEx, sTag, sNonTag
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
sTag = "<[^>]*>"
sNonTag = "[^<]*?"
objRegEx.Pattern = "(" & sTag & ")|(" & sNonTag & ")*?)(byta?)"
sText = objRegEx.replace(sText, "\1<span style='color: red'>\3</span>")
BytaText = sText
End FunctionSv: Färga valda ord?
Pröva
<code>
objRegEx.Pattern = "((" & sTag & "|" & sNonTag & ")*?)(byta?)"
sText = objRegEx.replace(sText, "$1<span style='color: red'>$3</span>")
</code>
(Skippade även några onödiga parenteser)
Henkoz: Inga avancerade saker har använts. Allt finns så vitt jag sett VBScript.Sv: Färga valda ord?
Felet är på den raden som "objRegex.replace" finns på.
Blir det någon slags loop eller nåt?Sv: Färga valda ord?
<code>
objRegEx.Pattern = "((?:" & sTag & "|" & sNonTag & ")*?)(byta?)"
sText = objRegEx.replace(sText, "$1<span style='color: red'>$2</span>")
</code>
Mvh,
ThomasSv: Färga valda ord?
Sv: Färga valda ord?
Den här koden funkar för mig:
<code>
<%
Function BytaText(sText)
Dim objRegEx, sTag, sNonTag
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
sTag = "<[^>]+>"
sNonTag = "[^<]+?"
objRegEx.Pattern = "((<[^>]+?>|[^<]+?)*?)(byta?)"
sText = objRegEx.replace(sText, "$1<span style='color: red'>$3</span>")
BytaText = sText
End Function
text = "Jag vill byta1 grejer, du skall byta3 grejer, han måste byta4 grejer? Hon borde byta5 grejer. Fisken bytte färg."
newtext = bytatext(text)
response.write(newtext)
%>
</code>
Se själv: http://inet.bluerange.se/inta03pepe/regexp.asp
(Lägger kanske till ett formulär så att du kan pröva olika texter.)Sv: Färga valda ord?
Det går nog men hur svårt det är är en annan fråga.
Man vill ju kunna säga att "byt ut byt eller byta mot ... om det inte är inom a taggar..."
EDIT:
Ok, den bryter inte länkarna men den ersätter inuti a taggar vilket enligt mig är fel...
Mvh,
ThomasSv: Färga valda ord?
Den kontrollerar om nästa tag som kommer är </a och hoppar över den träffen om så är fallet...
<code>
Function BytaText(sText)
Dim objRegEx
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "((?:<[^>]+?>|[^<]+?)*?)(byta?)(?![^<]*</a)"
sText = objRegEx.Replace(sText, "$1<span style='color: red'>$2</span>")
BytaText = sText
End Function
</code>
Mvh,
ThomasSv: Färga valda ord?
Men med följande pattern...
objRegEx.Pattern = "(byta?)(?![^<]*</.+>)"
... fungerar den med <img> taggen också, bara man kommer ihåg att lägga till </img> efter. Men det kanske finns en ännu bättre lösning.Sv: Färga valda ord?
Pers mönster är också insatt...
Mvh,
ThomasSv: Färga valda ord?
Så långt jag testat den fungerar den utan fel...
<code>
Function BytaText(sText)
Dim objRegEx
Set objRegEx = New RegExp
objRegEx.Global = True
objRegEx.IgnoreCase = True
objRegEx.Pattern = "(byta?)(?![^<>]*>|[^<]*</a)"
sText = objRegEx.Replace(sText, "<span style='color: red'>$1</span>")
BytaText = sText
End Function
</code>
EDIT:
Enda gången detta mönster inte fungerar är när det står till exempel såhär: <p class="byt1">Byt2 här</p>Byt3 och byt4>byt5
Det enda som kommer att träffas ovan är byt2 och byt5...
Mvh,
ThomasSv: Färga valda ord?
Du måste köra det i nyare verion av RegExp som stödjer Lookbehind tyvärr...
Mönstret är i alla fall följande...
<info>(byta?)(?![^<>]*(?<=<[^<>]*?)>|[^<]*</a)</info>
Mvh,
ThomasSv: Färga valda ord?
Sv: Färga valda ord?
Det där fungerade inte alls bra...
Testa köra fast med följande text: Hej! Bytt är byta BYT!
Mvh,
ThomasSv: Färga valda ord?
Men jag tänkte ifall det finns nån RIKTIGT bra sida där man kan läsa allt man behöver veta om regexp och en massa exempel så att man verkligen fattar..
Tycker det är grymt svårt att förstå regexp faktiskt.Sv: Färga valda ord?
Jag tror att den funktionen där jag kombinerade Pers uttryck med lite av mitt för att säkerställa att man inte är inom a taggar fungerar bäst...
Mvh,
ThomasSv: Färga valda ord?
VBScript gör dock inte det för där kan man bara kika frammåt i strängen...
Mvh,
ThomasSv: Färga valda ord?
(((^|</?[^a][^>]*>|<a[^>]*>.*?</a>)[^<]*?)*?)(byta?)
Under VB hänger det sig dock. Varför vet jag inte.Sv: Färga valda ord?
Men den klarar inte av följande: byta blöja på en bytta
Byt träffas i "byt.htm" vilket den inte fick göra...
Mvh,
ThomasSv: Färga valda ord?
Sv: Färga valda ord?
Som jag skrev tidigare, om man skulle kunna använda Lookaround fullt ut fungerar mitt uttryck här lite ovanför men VBScript har inte stöd för det fullt ut så man måste ju göra det bästa av situationen...
Mvh,
Thomas