Дезинфицировать строку с не алфавитным повторением - PullRequest
5 голосов
/ 28 марта 2010

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

Exemples:

  • Купи мой товар !!!!!!!!!!!!!!!!!!!!!!!!
  • Купи мой товар!? !? !? !? !? !
  • Купи мой товар !!!!!!!!! ....... !!!!!!!!
  • Купить мой товар <----------- </li>

Некоторым приемлемым решением было бы сокращение повторения не алфавита до 2.

Так я бы получил:

  • Купи мой товар !!
  • Купи мой товар!? !
  • Купи мой товар !! .. !!
  • Купить мой товар <- </li>

Это решение не сработало так:

preg_replace('/(\W{2,})(?=\1+)/', '', $title)

Есть идеи, как это сделать в PHP с помощью регулярных выражений?

Также приветствуется другое лучшее решение (я не могу удалить все не алфавитные символы, поскольку они могут иметь смысл).

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

Ответы [ 3 ]

2 голосов
/ 28 марта 2010

Это действительно неэффективная проблема для решения с помощью регулярных выражений, особенно если повторяющееся выражение произвольно велико. На практике этого достаточно, чтобы ограничить длину повторяющегося выражения примерно 3–5, и это должно быть намного проще.

Что-то вроде

$title = preg_replace('/(\W{1,5})(?=\1+)/', '', $title);

должно работать.

Некоторые предварительные испытания показывают, что

$title = 'Buy my product !!!!!!!!!!!!!!!!!!!!!!!! Buy my product !? !? !? !? !? !? Buy my product !!!!!!!!!.......!!!!!!!! Buy my product <-----------';

$title = preg_replace('/(\W{1,5})(?=\1{2,})/', '', $title);

echo $title;

выдаст

Buy my product !! Buy my product !? !? Buy my product !!..!! Buy my product <--

Похоже, что вы прошли все ваши тесты.


Re: Гордон

Ваша строка:

¸·´`·¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

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

$title = preg_replace('/(\W{1,9})(?=\1{2,})/', '', $title);

, прежде чем оно упрощается до

¸·´`·¸·´`·¸ Human ·-> creativity << is endless !¡!¡! ☻☺

(что означает, что preg_replace не поддерживает Unicode - да ладно)

Вы также можете настроить его так, чтобы он повторялся только один раз:

$title = preg_replace('/(\W{1,9})(?=\1+)/', '', $title);

, в этом случае оно становится:

¸·´`·¸ Human ·-> creativity < is endless !¡! ☻☺

Если вы считаете, что можно создать множество «ASCII-изображений», даже если требуется повторить их менее двух раз, ну, это выходит за рамки этого вопроса. Чтобы свести к минимуму искусство ASCII, я бы порекомендовал просто использовать что-то вроде:

preg_replace('/(\W{5})\W+/', '$1', $title);

(т. Е. Просто укажите количество не буквенно-цифровых символов, которые могут отображаться в строке. Обратите внимание, что это необходимо настроить для совместимости с языками с нелатинскими алфавитами, такими как русский).

1 голос
/ 28 марта 2010

У меня есть немного другой ответ

if (preg_match('/^[^\da-z\s_-]$/i', $str)) {

  // auto post, but flag to moderator to inspect title OR
  // instead of auto posting, put in 'waiting to be authorised' by a mod

}

Я надеюсь, что это регулярное выражение верно, но я не проверял его. По сути, он должен определять, когда в заголовке есть символы, отличные от 0-9, A-Z (без учета регистра), пробелы, подчеркивание и тире. Конечно, вы можете изменить это по своему вкусу.

Также было бы неплохо сообщить конечному пользователю

"Титулы, которые намеренно пытаются привлечь внимание без пользы описание товара может быть удалено без предупреждение "

0 голосов
/ 28 марта 2010

Использовать не жадный поиск?

preg_replace('/(\W{2,}?)(?=\1+)/', '', '{{your data}}');

результат

  * Buy my product !!
  * Buy my product !?
  * Buy my product !!!...!!
  * Buy my product <---
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...