HTML Escapeing - Рег выражения? - PullRequest
4 голосов
/ 05 мая 2009

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

Фраза может быть:

Павел сказал: «Он пропустил нас примерно на фут». На самом деле это было только около 9 ".

Чтобы избежать этой фразы, это действительно должно быть

<code><pre>Paul said &ldquo;It missed us by about a foot&rdquo;.  
In fact it was only about 9&prime;.

Что дает

<code><pre>Paul said “It missed us by about a foot”. 
     In fact it was only about 9″.

Я не могу вспомнить пример фразы, которую можно добавить в "escape", но это может быть там!

Я ищу некоторую помощь в том, как определить, какие из escape-значений заменить "символами" во время выполнения. Фраза была всего лишь примером, и она могла быть чем угодно, но должна быть правильно сформирована, то есть открывающая и закрывающая цитата присутствовать, если мы хотим правильно избежать текста.

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

&ldquo;

затем

&rdquo;    

Если я нашел "заменить его на «
если только после числа, где я заменяю его на

&Prime;

Как бы я справился с несколькими кавычками в предложении?

"It just missed" Paul said "by a foot".  

Это бы меня действительно озадачило .....

<code><pre>"It just missed" Paul said "by 9" almost".

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

“It just missed” Paul said “by 9″ almost”.

Очевидно, это крайний случай, но я задавался вопросом, возможно ли избежать этого во время выполнения без понимания содержания? Если бы не помощь по более очевидным фразам, был бы оценен.

Ответы [ 6 ]

3 голосов
/ 05 мая 2009

Я бы сделал это в два прохода:

Первый проход ищет любые "s", которым непосредственно предшествуют числа, и выполняет эту замену:

s/([0-9])"/\1&Prime;/g

В зависимости от текста, с которым вы имеете дело, вы можете / должны расширить это регулярное выражение, чтобы также распознавать числа, которые записаны как слова; Я проверил только цифры для простоты.

Со всеми этими заботами второй проход может легко конвертировать пары "s", как вы описали:

s/"([^"]*)"/&ldquo;\1&rdquo;/g

Обратите внимание на использование [^"]* вместо .* - мы хотим найти два набора двойных кавычек с любым количеством не двойных кавычек символов между ними. Добавив это ограничение, не возникнет проблем при обработке строк с несколькими разделами в кавычках. (Это также может быть выполнено с использованием не жадного .*?, но класс отрицанных символов более четко определяет ваше намерение и, в большинстве реализаций регулярных выражений, более эффективен.)

Заблудившееся несоответствие "где-то в строке" или метка в дюйме, пропущенная при первом проходе, конечно, может по-прежнему вызывать проблемы, но невозможно избежать этой возможности, не реализовав понимание содержимого. *

1 голос
/ 05 мая 2009

Я знаю, что это со стены, но вы рассматривали Механический турок ? Это та проблема, в которой люди преуспевают, а компьютеры в настоящее время ужасны. Выбор правильной пунктуации требует понимания смысла предложения, поэтому регулярное выражение обязательно завершится неудачно.

1 голос
/ 05 мая 2009

Я не уверен, возможно ли вообще это сделать, не понимая смысла предложения. Я склонен сомневаться в этом.

Моя первая попытка будет следующей.

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

Я совершенно уверен, что вы легко можете потерпеть неудачу в этой стратегии. Но это все еще простой случай - тяжелая работа начинается, когда вам приходится иметь дело с вложенными кавычками.

1 голос
/ 05 мая 2009

Интересно, можно ли сбежать? это во время выполнения без понимание содержания?

Учитывая, что вы добавляете семантическое значение к пунктуации, которая в настоящее время закодирована в другом тексте ... нет, не совсем.

Регулярные выражения были бы самым простым инструментом по крайней мере для его части. Я бы посоветовал искать / \ d + "/ для случаев с числами в дюймах. Но для разделителей кавычек, после того как вы искали какие-либо другие особые случаи или фразы, может быть проще использовать алгоритм для сопоставления пар, как в скобках и скобки: токенизируйте и считайте. Затем проверьте реальный ввод и уточните.

Но я действительно должен спросить: почему?

1 голос
/ 05 мая 2009

То, что вы описали, в основном скрытая модель Маркова,

http://en.wikipedia.org/wiki/Hidden_Markov_model

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

извините, это, вероятно, не очень полезно, если вы пытаетесь подготовить что-то для развертывания, но вход имеет большую двусмысленность, чем вывод, поэтому ваш единственный вариант - рассмотреть контекст, и это в основном означает либо очень длинный набор правил, или какой-то подход машинного обучения.

интересный вопрос - было бы неплохо увидеть, какую производительность вы можете получить. может, кто-то уже написал на нем статью?

0 голосов
/ 05 мая 2009

Вы можете попробовать что-то вроде этого. Сначала замените цитаты этим регулярным выражением:

"((?:[^"\d]+|\d"?)*)"

А чем дюймовый знак:

(\d+)"

Вот пример на JavaScript:

'"It just missed" Paul said "by 9" almost"'.replace(/"((?:[^"\d]*|\d["']?)+)"/g, "&ldquo;$1&rdquo;").replace(/(\d+)"/g, "$1&Prime;");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...