[JS/RegExp] Strip bold tags van string

Pagina: 1
Acties:

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Ik probeer een javascript functie te schrijven, die een string zonder bold tags retourneert als deze bold tags blijkt te bevatten. Pseudo:
Java:
1
2
3
4
5
6
7
8
function check_string(string) {
  if (string starts with <b> and ends with</b>) {
    return string without tags;
  }
  else {
    return string;
  }
}


Ik ben voor het eerst in de RegExps gedoken om deze functie werkend te krijgen. Na diverse manuals te hebben gelezen heb ik nu de volgende RegExp die kijkt of een string tussen bold-tags staat:
code:
1
<b[^>]*>(.*?)</b>

Op dit moment zit ik echter al een tijdje vast. Ik heb voornamelijk twee vragen:
  • is dit de meest efficiente RegExp?
  • hoe ga ik nu verder? Moet ik de RegExp uitbreiden zodat hij de bold-tags stript of moet ik hiervoor een aparte regel (string.replace?) schrijven?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Waarom gooi je niet gewoon <b[^>]*> en </b> uit de string? Je wilt ze weg hebben, dus ook als ze niet in een paar voorkomen moeten ze weg. Doe dus een eenvoudige replace, desnoods met de regex /<\/?b[^>]*]>/g

[ Voor 19% gewijzigd door Verwijderd op 11-05-2005 21:23 ]


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Verwijderd schreef op woensdag 11 mei 2005 @ 21:22:
Doe dus een eenvoudige replace, desnoods met de regex /<\/?b[^>]*]>/g
Dat snap ik niet - je bedoelt?
Java:
1
2
3
4
function strip_tags(string) {
  string = string.replace(/<\/?b[^>]*]>/g, string);
  alert(string);
}

Ook als de string bold-tags bevat, retourneert hij de hele string...

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 22:14

thomaske

» » » » » »

Reveller schreef op woensdag 11 mei 2005 @ 21:43:
[...]

Dat snap ik niet - je bedoelt?
...
Ook als de string bold-tags bevat, retourneert hij de hele string...
en dit?
Java:
1
2
3
4
function strip_tags(string) {
  string = string.replace(/<\/?b[^>]*>/g, '');
  alert(string);
}

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@thomaske - dat werkt :) Uiteindelijk wil ik een functie die een string omgeeft door bold-tags als de string nog niet bold is, of de bold-tags weghaalt als de string al bold is:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function bold(string) {
  if (!/<\/?b[^>]*>/g) {
    string = '<b>'+string+'</b>';
  }
  else {
    string = string.replace(/<\/?b[^>]*>/g, '');
  }
  alert(string); 
}
</script>

<form>
  <input type="text" name="text">
  <input type="button" onclick="bold(document.forms[0].text.value);" value="toggle">
</form>

Dit werkt alleen niet. Waarschijnlijk zit de fout in regel 3 en kun je niet zomaar op een regexp checken. Via welke weg kan ik ervoor zorgen dat het if statement controleer of de ingevoerde string omgeven is door bold-tags?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • thomaske
  • Registratie: Juni 2000
  • Laatst online: 22:14

thomaske

» » » » » »

met test() kan je een regexp testen op een string:
Java:
1
2
3
  if (!/<\/?b[^>]*>/g.test(string)) {
    string = '<b>'+string+'</b>';
  }

Brusselmans: "Continuïteit bestaat niet, tenzij in zinloze vorm. Iets wat continu is, is obsessief, dus ziekelijk, dus oninteressant, dus zinloos."


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Dat werkt perfect :) Er valt me alleen iets tegen - nu ik aan het testen ben, blijkt dat deze regex alle bold-tags van een string stript. Bij het maken van de regex (aan de hand van een manual) dacht ik een regex gemaakt te hebben die bold-tags alleen stript als ze de string omvatten. Met andere woorden:
code:
1
2
3
4
5
6
input                    | gewenste output:
-------------------------+-------------------------
<b>dit is een string</b> | dit is een string
dit is een string<b>     | dit is een string<b>
dit<b>is een</b> string  | dit <b>is een</b> string
</b>dit is een string<b> | </b>dit is een string<b>

Nu is de output bij alle voorbeelden "dit is een string". Hoe bepaal ik nu dat de bold tags alleen gestript worden als de string begint met < b> en eindigt met < /b>?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


Verwijderd

Maak gebruik van ^ en $ en een klein beetje creativiteit.

  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
Om terug te komen op mijn eerste regex..als ik hem aanpas met de hint van Cheatah krijg ik dit:
code:
1
^<b[^>]*>(.*?)</b>$

Volgens mij checkt deze regexp of de string begint met een bold-tag (eventueel met properties) en eindigt met een bold-tag. Probleem is alleen dat de volgende functie niet werkt:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<script>
function bold(string) {
  if (!^<b[^>]*>(.*?)</b>$.test(string)) {
    string = '<b>'+string+'</b>';
  }
  else {
    string = string.replace(^<b[^>]*>(.*?)</b>$, '');
  }
  alert(string);
}
</script>

<form>
  <input type="text" name="text">
  <input type="button" onclick="bold(document.forms[0].text.value);" value="toggle">
</form>

De javascript Console van FF geeft een syntax error aan - wat is dan wel de correcte syntax? Als ik iets aan de systax verander (bv. regex met slash laten beginnen), klopt de regex toch niet meer?

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

de slashes zijn de constructor voor het regexp object, dus die zijn zeker wel noodzakelijk:
JavaScript:
1
string = string.replace(/^<b[^>]*>(.*?)</b>$/, '');

of als alternatief:
JavaScript:
1
2
var re = new RegExp('^<b[^>]*>(.*?)</b>$');
string = string.replace(re, '');

Intentionally left blank


  • Reveller
  • Registratie: Augustus 2002
  • Laatst online: 05-12-2022
@Crisp, dank je - ik ben weer iets verder. Ik heb nu onderstaande code. Daar zit alleen nog een fout in: als de input "< b>dit is een string< /b>" is, is de output leeg, in plaats van "dit is een string". Blijkbaar ben ik niet creatief genoeg geweest met ^ en $. Wie ziet de fout? Moeilijke materie overigens, regexp...
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
<script>
function bold(string) {
  var re = new RegExp('^<b[^>]*>(.*?)</b>$');
  if (!re.test(string)) {
    string = '<b>'+string+'</b>';
  }
  else {
    string = string.replace(re, '');
  }
  alert(string);
}
</script>

<form>
  <input type="text" name="text">
  <input type="button" onclick="bold(document.forms[0].text.value);" value="toggle">
</form>

"Real software engineers work from 9 to 5, because that is the way the job is described in the formal spec. Working late would feel like using an undocumented external procedure."


  • crisp
  • Registratie: Februari 2000
  • Nu online

crisp

Devver

Pixelated

JavaScript:
1
string = string.replace(re, '$1');

;)

Intentionally left blank

Pagina: 1