2010-06-21 2 views
0

В настоящее время у меня есть:JQuery - Как я могу сделать эту работу (тег замен)

this.html(this.html().replace(/<\/?([i-z]+)[^>]*>/gi, function(match, tag) { 
      return (tag === 'p') ? match : '<p>'; 
      return (tag === '/p') ? match : '</p>'; 
      return (tag === 'script') ? match : 'script'; 
      return (tag === '/script') ? match : '/script'; 
     })); 

Однако <p> и <script> теги по-прежнему удалены, что я делаю неправильно?

+1

кажется плохой идеей, чтобы манипулировать HTML с регулярным выражением, как это ... – jAndy

+1

Просто побежал код, направил его обратно к себе, чтобы ссылаться на $ («тело») не это". поднял предупреждение для тега и соответствия. Я получаю тег для/p, который isnt/p для/p, он выходит как «p». и тег для скрипта выходил как «s» У меня что-то не так? –

ответ

3

Я уверен, что это регулярное выражение не работает для закрытия тегов, и только поиск i-z не улавливает полный тег.

Попробуйте регулярное выражение:

/<\(/?[a-z]+)[^>]*>/gi

что-то странное происходит с кодом, хотя при попытке вернуть «< сценарий >» при согласовании сценария и в таких случаях может быть return match

голова Энди Э-х предложение об изменении структуры заявления if, я думаю, тоже помогает, главное -

else 
     return match; 

или даже сделать это по умолчанию вместо того, чтобы специально искать теги p и script, он вернет значение соответствия совпадающего тега, если инструкция if if не выполняется.

Код я написал для тестирования:

<!DOCTYPE HTML> 
<html> 
<body> 
<div id="manipulate"> 
<p>Hello</p> 
<script type="text/ecmascript"> 
// test 
</script> 
</div> 
<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js" type="text/ecmascript"></script> 
<script type="text/ecmascript"> 
$(document).ready(function(){ 
alert("start"); 
$("#manipulate").html($("#manipulate").html().replace(/<\/?([a-z]+)[^>]*>/gi, function(match, tag) { 
      alert(tag); 
      alert(match); 
     if (tag === 'p') 
      return '<p>'; 
     else if (tag === '/p') 
      return '</p>'; 
     else if (tag === 'script') 
      return match; 
     else if (tag === '/script') 
      return match; 
     else 
      return match; 
     })); 
}); 
</script> 
</body> 
</html> 
+0

Работал groovy , приветствует v. много. –

+0

+1, совсем не видел бит [i-z], мое внимание привлекло эти троичные операторы :-) –

+0

@ Andy: стыдно, что вы не можете составить комбинированный правильный ответ, чтобы все участники получали очки. –

7

Вы не можете использовать несколько операторов возврата с такими тройными операторами. Первый будет оценен, и все остальное будет проигнорировано. Используйте соответствующие if заявления или switch заявления,

 if (tag === 'p') 
      return '<p>'; 
     else if (tag === '/p') 
      return '</p>'; 
     else if (tag === 'script') 
      return 'script'; 
     else if (tag === '/script') 
      return '/script'; 
     else 
      return match; 

switch пример:

switch (tag) { 
    case 'p': return '<p>'; 
    case '/p': return '</p>'; 
    //... 
    case default: return match; 
} 

Вы также можете использовать объект в качестве карты,

var map { 'p': '<p>', '/p' : '</p>' /*, ... */ }; 
return map[tag] || match; 

или вложенных тройных операторы,

return tag === 'p' ? '<p>' 
     : tag === '/p' ? '</p>' 
     : tag === 'script' ? '<script>' 
     : tag === '/script' ? '</script>' 
     : match; 

Но они часто менее читабельны и сложнее поддерживать.

+0

Или вы можете использовать оператор switch для своей структуры if/else if/else - я думаю, это только вопрос личных предпочтений. –

+0

@Ken, да, это еще один вариант, и я добавил пример. –

+0

Не могли бы вы уменьшить много дублирования, имея массив '['p', 'script']' и только обертывая переменную в '<>', если она соответствует 'x' или'/x'? Просто кажется, что 'p' и' script' написали много там. – Jeriko

Смежные вопросы