Фильтровать все типы пробелов в PHP - PullRequest
5 голосов
/ 12 июля 2010

Я знаю, что существует много типов пространства (например, пробел, пробел, пробел, неразрывный пробел и т. Д.), Но все они, на которые я ссылался, имеют HTML-сущности (по крайней мере, PHP htmlentities ()вернуть что-то вроде.

Но как насчет тех пробелов, у которых нет сущностей HTML?
Пример: [пример URL больше не действителен]
Посмотрите на псевдоним этой учетной записи. У него много ""(пробелы) спереди, которые видимы для нас (этого не происходит с).

Я уже пробовал фильтровать с помощью регулярных выражений, используя \ x escape, фильтровать с помощью str_replace (), с пробеломв качестве аргумента, и не повезло вообще!

Есть ли у вас какие-либо предложения о том, как отфильтровать ВСЕ типы пробелов?

Ответы [ 3 ]

22 голосов
/ 12 июля 2010

\s по умолчанию будет не совпадать с пробельными символами со значениями, превышающими 128. Вместо этого вы можете использовать другие последовательности с поддержкой UTF-8.


(Стандартный отказ от ответственности: я скину исходный код PCRE для составления списков ниже, я могу пропустить символ или ввести что-то неправильно. Пожалуйста, прости меня.)

\p{Zs} совпадений:

  • U + 0020 Пробел
  • U + 00A0 Пространство без перерывов
  • U + 1680 Знак пробела Огама
  • U + 180E Монгольский разделитель гласных
  • U + 2000 En quad
  • U + 2001 Em Quad
  • U + 2002 En пробел
  • U + 2003 Em пробел
  • U + 2004 Пробел три на каждого
  • U + 2005 Четырехместное пространство
  • U + 2006 Пробел на шесть мест
  • U + 2007 Пространство рисунка
  • U + 2008 Пунктуация
  • U + 2009 Тонкое пространство
  • U + 200A Пространство для волос
  • U + 202F Узкое пространство без перерывов
  • U + 205F Среднее математическое пространство
  • U + 3000 Идеографическое пространство

\h (Горизонтальные пробелы) совпадает с \p{Zs} выше, плюс

  • U + 0009 Горизонтальная табуляция.

Аналогично для сопоставления вертикальных пробелов есть несколько вариантов.

\p{Zl} соответствует разделителю U + 2028.

\p{Zp} соответствует U + 2029 Разделитель абзацев.

\v (вертикальный пробел) соответствует \p{Zl}, \p{Zp} и следующим

  • U + 000A Linefeed
  • U + 000B Вертикальная вкладка
  • U + 000C Formfeed
  • U + 000D Возврат каретки
  • U + 0085 Следующая строка

Возвращаясь к началу, в режиме UTF-8 (т. Е. С использованием модификатора шаблона u) \s будет соответствовать любому символу, который соответствует \p{Z} (что-либо, что \p{Zs}, \p{Zl} и \p{Zp} будет соответствовать), плюс

  • U + 0009 Горизонтальная табуляция
  • U + 000A Linefeed
  • U + 000C Formfeed
  • U + 000D Возврат каретки

Короче говоря (я готов поспорить, что вы прочитали все вышеперечисленное, не так ли?), Вы можете использовать \s, но убедитесь, что находитесь в режиме UTF-8, например /\s/u. Если применить это на практике, чтобы отфильтровать те подходящие пробельные символы из строки, вы бы сделали что-то вроде

$new_string = preg_replace('/\s/u', '', $old_string);

Наконец, если вы действительно действительно заботитесь о вертикальных пробелах, которые не включены в \s (LF и NEL), тогда вы можете использовать класс символов [\s\v], чтобы сопоставить все 26 из перечисленных выше пробельных символов.

2 голосов
/ 12 июля 2010

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

Попробуйте это:

preg_replace("/\s{2,}/", " ", $text);
1 голос
/ 12 июля 2010
$result = preg_replace('/\s/', '', $yourString)

См. http://www.php.net/manual/en/regexp.reference.backslash.php для получения дополнительной информации о \s

...