RegEx: Ссылка Twitter-Name Упоминает на Twitter в HTML - PullRequest
0 голосов
/ 16 ноября 2009

Я хочу сделать ЭТО , чуть сложнее:

Допустим, у меня есть ввод HTML:

<a href="http://www.example.com" title="Bla @test blubb">Don't break!</a>
Some Twitter Users: @codinghorror, @spolsky, @jarrod_dixon and @blam4c.
You can't reach me at blam4c@example.com.

Есть ли хороший RegEx для замены имени пользователя в твиттере ссылками на твиттер, но оставить @example (адрес электронной почты внизу) И @test (в заголовке ссылки, т. Е. В HTML-тегах)?

Вероятно, следует также попытаться не добавлять ссылки в существующие ссылки, т. Е. Не нарушать это:

<a href="http://www.example.com">Hello @someone there!</a>

Моя текущая попытка - добавить «>» в ​​начале строки, а затем использовать этот RegEx:

Search:  '/>([^<]*\s)\@([a-z0-9_]+)([\s,.!?])/i'
Replace: '>\1<a href="http://twitter.com/\2">@\2</a>\3'

Затем удалите ">", который я добавил на шаге 1.

Но это не будет соответствовать ничему, кроме "@ blam4c". Я знаю, ПОЧЕМУ это так, это не проблема.

Я хотел бы найти решение, которое находит и заменяет все упоминания имен пользователей в Твиттере, не разрушая HTML. Может быть, даже лучше кодировать это без RegEx?

Ответы [ 3 ]

3 голосов
/ 16 ноября 2009

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

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

Я позволю другим людям попытаться дать конкретный ответ на часть регулярного выражения.

2 голосов
/ 16 ноября 2009

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

Предположительно, вы начинаете с реального сообщения Twitter, которое не может по определению включать любые введенные вручную гиперссылки.

Например, вот как я нашел этот вопрос (ссылка разрешается на этот вопрос, поэтому не стесняйтесь нажимать на него!)

Некоторые пользователи Twitter: @codinghorror, @spolsky, @jarrod_dixon и @ blam4c. http://bit.ly/2phvZ1

В этом случае это просто:

var msg = "Some Twitter Users: @codinghorror, @spolsky, @jarrod_dixon and @blam4c. http://bit.ly/2phvZ1";

var html = Regex.Replace(msg, "(?<!\w)(@(\w+))", 
    "<a href=\"http://twitter.com/$2\">$1</a>");

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

Что касается ваших более сложных случаев (с HTML-разметкой, встроенной в твиты), я понятия не имею. Слишком сложно для меня.

1 голос
/ 23 января 2012

Это регулярное выражение может работать немного лучше: /\B\@([\w\-]+)/gim

Вот пример этого jsFiddle: http://jsfiddle.net/2TQsx/4/

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...