2016-07-29 2 views
1

Не уверен, что это можно сделать в regexp под javascript, но подумал, что было бы интересно посмотреть, возможно ли это. Так что подумал, что я убираю кусок html, чтобы удалить большинство тегов, буквально просто отбрасывая их, поэтому <H1><img><a href ....>. И это было бы относительно просто (хорошо, украл основу из другого поста, спасибо karim79 Remove HTML Tags in Javascript with Regex).regexp looping и logic в javascript

function(inString, maxlength, callback){ 
     console.log("Sting is " + inString) 
     console.log("Its " + inString.length) 

     var regex = /(<([^>]+)>)/ig 
     var outString = inString.replace(regex, ""); 
     console.log("No HTML sting " + outString); 
     if (outString.length < maxlength){ 
      callback(outString) 
     } else { 
      console.log("Lets cut first bit") 
     } 
    } 

Но потом я начал думать, есть способ, которым я могу управлять выполнением регулярных выражений. Так что скажем, что я хочу сохранить определенные вкладки, такие как b, br, i и, возможно, изменить H1-6 на b. Таким образом, в псевдокоде, что-то вроде:

for (var i in inString.regex.hits) { 
    if (hits[i] == H1) { 
     hits[i] = b; 
    } 
} 

Вопрос заключается в том, что я хочу, чтобы текст не тот HTML тегов, чтобы остаться, как есть, и я хочу, чтобы просто вырезать по умолчанию. Конечно, одним из вариантов было бы изменить те, которые я хочу сохранить. Произнесите изменение <b> на [[b]], как только это будет сделано для всех заинтересованных. Затем верните их обратно в <b> после того, как все неизвестные были удалены. Так как это (только для Ь, а не определенный код ниже будет работать):

function(inString, maxlength, callback){ 
     console.log("Sting is " + inString) 
     console.log("Its " + inString.length) 

     var regex-remHTML = /(<([^>]+)>)/ig 
     var regex-hideB = /(<b>)/ig 
     var regex-showB = /([b])/ig 
     var outString = inString.replace(regex-hideB, "[b]"); 
     outString = outString.replace(regex-remHTML, ""); 
     outString = outString.replace(regex-showB, "<b>"); 
     console.log("No HTML sting " + outString); 
     if (outString.length < maxlength){ 
      callback(outString) 
     } else { 
      console.log("Lets cut first bit") 
     } 
    } 

Но это было бы возможно, чтобы быть умнее, писать треск ethat говорит вот peice из HTML тега, запустить этот код против матч.

+0

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

+0

Сначала я думал об этом, но есть ли «настраиваемые». В этом случае аспект безопасности составляет лишь половину. Причина в том, что HTML-код, который входит в него, - это статья, и ожидается, что код примет первое «n» количество символов и сделает его привлекательным для статьи. – vrghost

ответ

2

Как Тим Biegeleisen сай в своем комментарии, возможно, лучшим решением может использовать парсер вместо Regex ...

Кстати, если вы хотите, чтобы контролировать то, что будет изменено регулярное выражение вы можете передать функцию обратного вызова к String.prototype.replace:

var input = "<div><h1>CIAO Bello</h1></div>"; 
 

 
var output = input.replace(/(<([^>]+)>)/gi, (val) => { 
 
    
 
    if(val.indexOf("div") > -1) { 
 
     return ""; 
 
    } 
 
    
 
    return val; 
 
    }) 
 
; 
 

 
console.log("output", output);

+0

Выглядит хорошо. Может быть, глупый вопрос, на каком языке это (инструкция if для val.indexOf для меня не похожа на javascript, но это может быть потому, что я просто недостаточно хардкор. – vrghost

+0

Да, это javascript: https: //developer.mozilla .org/en-US/docs/Web/JavaScript/Reference/Global_Objects/String/indexOf – Hitmands

+1

Теперь имеет смысл, старый скрипт ksh, я подумал, что это может быть какой-то странный код регулярного выражения. Но теперь мне ясно, что это что вы пишете код по-другому для меня (и, наверное, лучше, в конце концов, вы ответили на мой вопрос). Я бы написал «Войну и кусок», если бы :) – vrghost