Санировать предложение в php - PullRequest
9 голосов
/ 06 декабря 2011

Название может показаться странным, но я пытаюсь настроить это preg_replace, которое заботится о грязных авторах текстовой области. Это должно:

  1. если есть восклицательный знак, другого подряд не должно быть.
  2. если есть., Запятая выигрывает, и это должно быть,
  3. когда перед комой стоит один + пробел, его следует уменьшить до нуля.
  4. предложение не может начинаться или заканчиваться запятой.
  5. никогда не должно быть более 2 одинаковых букв, соединенных вместе.
  6. пробел должен всегда присутствовать после запятой.

например:.

  • , Мой дом, который зеленый., Хорош!
  • Мой дом ..., который зеленый, хорош !!!
  • Мой дом зелёный ,,, хорош !!

Конечный результат всегда должен быть:

Мой зеленый домик хорош!

Есть ли уже построенное регулярное выражение, которое позаботится об этом?

Решение проверить FakeRainBrigand решение ниже!

Ответы [ 2 ]

8 голосов
/ 06 декабря 2011

Возможно, мне придется использовать это для моих собственных сайтов ... хорошая идея!

<?php

$text = 'My hooouse..., which is greeeeeen , is nice!!!  ,And pretty too...';

$pats = array(
'/([.!?]\s{2}),/', # Abc.  ,Def
'/\.+(,)/',  # ......,
'/(!)!+/',   # abc!!!!!!!!
'/\s+(,)/',  # abc   , def
'/([a-zA-Z])\1\1/', # greeeeeeen
'/,(?!\s)/'); 

$fixed = preg_replace($pats, '$1', $text);

echo $fixed;
echo "\n\n";

?>

И «модифицированная» версия $ text: «Мой зеленый дом хорош! И тоже симпатичен».

ОБНОВЛЕНИЕ: вот версия, которая обрабатывает «abc, def» -> «abc, def».

<?php

$text = 'My hooouse..., which is greeeeeen ,is nice!!!  ,And pretty too...';

$pats = array(
'/([.!?]\s{2}),/', # Abc.  ,Def
'/\.+(,)/',        # ......,
'/(!)!+/',         # abc!!!!!!!!
'/\s+(,)/',        # abc   , def
'/([a-zA-Z])\1\1/');      # greeeeeeen

$fixed = preg_replace($pats, '$1', $text);
$really_fixed = preg_replace('/,(?!\s)/', ', ', $fixed);

echo $really_fixed;
echo "\n\n";
?>

Я думаю, что это немного медленнее, так как это дополнительный вызов функции.

2 голосов
/ 06 декабря 2011
 - $result = preg_replace('/!+/', '!', $subject);
 - $result = preg_replace('/\.*,/', ',', $subject);
 - $result = preg_replace('/\s+(?=,)/', '', $subject);
 - $result = preg_replace('/^,*|,*$/', '', $subject);
 - $result = preg_replace('/([a-z])\1+/i', '$1$1', $subject);
 - $result = preg_replace('/,(?!\s)/', ', ', $subject);

Один за другим в соответствии с вашими правилами:)

...