2012-04-04 1 views
2

Итак, как предисловие, мне нужно это регулярное выражение, чтобы пройти мимо ошибки, которую я жду, когда люди на сервере исправят.Нужна помощь HTML regex (и да, я знаю, что это не должно быть сделано)

В основном я получаю JSON обратно с неэкранированных с \»

<div style="padding: 0%; width: 100%;"><span style="font-family:verdana;"><span style="font-size: 72px;">Demo!</span></span></div> 

ОБНОВЛЕНО INFO«символов в HTML Мне нужно регулярное выражение, которое выглядит между ними <> символов и заменяет.»:. Текст, хотя внутри некоторых JSON отправляется обратно в виде строки, что я в конце концов нужно разобрать на регулярной JSON, и синтаксический анализ терпит неудачу

строка выглядит примерно так:.

"{ 
"overlay": "overlay1", 
"type": "text", 
"text": "<div style="padding: 0%; width: 100%;"><span style="font-family:verdana;"><span style="font-size: 72px;">Demo!</span></span></div>" 
}" 

Это регулярное выражение до сих пор, что я нашел (я знаю, что некоторые регулярные выражения вещи, просто не много с видом впереди или позади

/(?<=\<)(.*?)(?=\>)/g 

Но использовать это только заставляет меня получение этого:

< div style = "padding: 0%; ширина: 100%;»> < диапазон стиль = "семейство шрифтов: Verdana;"> < пролет стиль = "Размер шрифта: 72px;"> Демо < /SPAN> < /SPAN> < /дел>

(в основном только все внутри <> символов. Когда я только действительно настроить таргетинг "внутри <>.)

Может ли кто-нибудь рекомендовать быстрое временное исправление? Благодаря!

+0

Какой язык или диалект регулярного выражения вы используете? Является ли PCRE вариантом, или это должно произойти в ERE? – ghoti

ответ

0

Попробуйте заменить (.*?) в центральной части с ([^<>]*?)
Вы должны быть осторожны с оператором точки.

3

Следующие должны работать (как временное решение):

/"(?=[^<]*>)/g 

Это будет соответствовать все двойные кавычки, где нет ни одного < символов до следующего >.

+0

Это работает! По крайней мере, для тестирования я делаю. Спасибо! –

+1

@JonathanRomanowski Нет проблем, если бы мой ответ сработал, вы можете [принять его] (http://meta.stackexchange.com/a/5235/155356), щелкнув контур галочки рядом с ответом. –

0

Попробуйте это:

string = string.replace(/\"/g, "\\\"");

// --- EDIT ---

var someString = "{ 
"overlay": "overlay1", 
"type": "text", 
"text": "<div style="padding: 0%; width: 100%;"><span style="font-family:verdana;"><span style="font-size: 72px;">Demo!</span></span></div>" 
}"; 

someString = someString.replace(/"(?=[^<]*>)/g, "\\\""); //Props @F.J for this RegEx 
Obj = $.parseJSON(someString); 
console.log(Obj.text); 
+0

Agh, извините. Думаю, мой вопрос немного другой. Html фактически находится внутри некоторого JSON. Мне нужно будет обновить вопрос. –

+0

Идея такая же ... рассмотрите редактирование. – Relic

+0

Я согласен, что идея такая же, но если я сделаю глобальную замену для всех, она «убежит» намного больше, чем нужно. Я обновил вопрос, извините за замешательство раньше. –

-1

Если это Perl, вы могли бы сделать что-то вроде:

$string =~ s/(?!\\)"/\\"/g; 
+0

perl не является языком на стороне клиента, а парсер регулярных выражений немного отличается. – Relic

+0

Нигде вопрос не говорит о языке на стороне клиента. Просто, что он получает JSON. –

+0

JSON = Обозначение объекта Javascript ... теперь я могу ошибаться, но я считаю, что Javascript - это клиентская сторона ... (кроме узла, которого это явно не так) И он говорит о том, чтобы ждать на стороне сервера парней для исправления, так что это не серверный язык, с которым работает OP. – Relic

0

Если JSON в противном случае хорошо сформирован, и у вас нет синтаксиса типа атрибута вне тегов, мычание должно работать на одной линии фиксирует:

var str = '<div style="padding: 0%; width: 100%;"><span style="font-family:verdana;"><span style="font-size: 72px;">Demo!</span></span></div>' 
str.replace(/([\w-]+)=\"(.*?)\"/g, '$1=\\\"$2\\\"') 
>> "<div style=\"padding: 0%; width: 100%;\"><span style=\"font-family:verdana;\"><span style=\"font-size: 72px;\">Demo!</span></span></div>" 

Это добавляет косую черту перед всеми HTML атрибутов везде, где они появляются (не обязательно внутри теги). Если вам нужно лучше настроить таргетинг, выполните свой первый поиск, чтобы изолировать теги, а затем пропустите каждый тег, выполняющий эту замену регулярным выражением.

Кстати, почему вы говорите: «Я знаю, что это не должно быть сделано»? Это идеальное использование для регулярных выражений!

+0

На самом деле RegEx НЕ предназначен для анализа HTML ...поэтому он очень прав, когда говорит, что это не должно быть сделано. Он должен быть превращен в элемент DOM и разбираться с устройством для чтения документов. – Relic

+0

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

+0

Он (вы, Джонатан) использует регулярные выражения для исправления синтаксической ошибки JSON. Будет ли он в конечном итоге отображаться как HTML или нет, на данный момент это не что иное, как неправильный текст JSON. Поэтому вполне нормально использовать регулярные выражения для его работы (по крайней мере, до тех пор, пока ошибка источника не будет исправлена). –

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