Перепутывание хэштегов регулярных выражений и объектов html

#php #regex

#php #регулярное выражение

Вопрос:

У меня есть выражение регулярных выражений #(w ) для отслеживания хэштега, такого как #wine, в строке, и это также происходит с объектами html, такими как amp;#039;. Мне бы это понадобилось, чтобы избежать этого, ища амперсанд. Как я могу это проверить?

Ответ №1:

Я предлагаю использовать отрицательное утверждение lookbehind, если движок регулярных выражений вашего языка поддерживает их:

 (?<!amp;)#(w )
 

В противном случае это сработало бы (хотя и несколько менее элегантно):

 (?:^|[^amp;])#(w )
 

Комментарии:

1. Второе регулярное выражение будет соответствовать t#wine тому, что может быть нежелательно.

2.Конечно. Я точно не знаю, что имеет в виду OP. Возможно, например, foo bar baz (#wine) должно совпадать. Второе регулярное выражение легко настроить по мере необходимости.

3. lang — это php, это работает, спасибо, у меня всегда возникают проблемы с негативным взглядом, спасибо за документ.

Ответ №2:

Вы можете попробовать использовать регулярное выражение, подобное этому (?:^|s)(#w ) , и выбрать первую захваченную группу в качестве совпадения.

Комментарии:

1. Это никуда не годится. Границы слов возникают, когда символ слова следует за символом, не являющимся словом (и наоборот). Поскольку «#» является символом, не являющимся словом, предыдущий символ должен быть символом слова, что почти наверняка не то, что имеет в виду OP. Вот краткий тестовый пример, который вы можете запустить в консоли вашего браузера: /b#w b/.test('#foo #bar #baz') (спойлер: он возвращается false ).

2. @davidchambers спасибо, что указали. исправлено регулярное выражение. Я просто пытался сделать что-то простое без оглядки и ошибся 🙂