Regex не работает с пробелами [dубликат]

или в файле .htaccess

AddOutputFilter DEFLATE css js ExpiresActive On ExpiresByType application/x-javascript A2592000
67
задан Léo Léopold Hertz 준영 14 August 2009 в 20:36
поделиться

10 ответов

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

  // http://stackoverflow.com/a/1279798/54964 $ str = preg_replace ('/ \ s +  / ',' ', $ str);   

Когда UTF-8 становится основным, это выражение будет чаще останавливаться / останавливаться, когда оно достигает новых символов utf-8, оставляя за ним пробелы \ s не может учитываться.

Чтобы справиться с новыми типами белых пространств, введенных в unicode / utf-8, требуется более обширная строка для сопоставления и удаления современного пробела.

Потому что регулярные выражения по умолчанию не распознают многобайтовые символы, для их идентификации может использоваться только разделительная мета-строка, чтобы исключить, чтобы сегменты байтов изменялись в других символах utf-8 ( \ x80 в quad set может заменить все байты \ x80 в умных кавычках)

  $ cleanedstr = preg_replace ("/ (\ t | \n | \ v | \ f  | \r | | \ xC2 \ x85 | \ xc2 \ xa0 | \ xe1 \ xa0 \ x8e | \ xe2 \ x80 [\ x80- \ x8D] | \ xe2 \ x80 \ xa8 | \ xe2 \ x80 \ xa9 | \ xe2  \ x80 \ xaF | \ xe2 \ x81 \ x9f | \ xe2 \ x81 \ xa0 | \ xe3 \ x80 \ x80 | \ xef \ xbb \ xbf) + / "," _ ", $ str);   

Здесь учитываются и удаляются вкладки, новые строки, вертикальные вкладки, формы, возврат каретки, пробелы и дополнительно из здесь :

nextline, неразрывные пробелы, разделитель монгольских гласных, [en quad, em quad, en space, em space, пространство три на em, пространство с четырьмя пробелами, пространство с шестью на em, пространство цифр, пространство препинания, тонкое пространство, пространство для волос, пространство с нулевой шириной, нулевой ширины, стопор для нулевой ширины, разделитель нулевой ширины], разделитель строк, разделитель абзацев, узкое пространство без разрыва, среднее математическое пространство, столярный столик, идеографическое пространство и нулевая ширина неразрывное пространство.

Многие из этих хакеров в файлах xml при экспорте из автоматизированных инструментов или сайтов, которые вытесняют текстовый поиск, распознавание и могут быть незаметно вставлены в исходный код PHP, что заставляет парсер перейти к следующей команде (разделители абзацев и строк), которые приводят к пропуску строк кода, что приводит к прерывистым необъяснимым ошибкам, которые мы начали называть «текстологическими заболеваниями»

[ не безопасно копировать и вставлять из Интернета. Используйте защитный код для защиты вашего кода. лол]

28
ответ дан Léo Léopold Hertz 준영 15 August 2018 в 22:38
поделиться
  • 1
    Как это? Я попытался объяснить, что старый не работает так, как должен – ppostma1 14 October 2016 в 21:26
  • 2
    Отлично! Можете ли вы указать количество персонажей, которые у вас есть в вашем наборе? - - Это поможет нам определить, что у вас действительно есть полный набор этих персонажей. - Я принял ваш ответ, потому что теперь он более полный, чем старый принятый ответ. – Léo Léopold Hertz 준영 14 October 2016 в 21:40
  • 3
    Спасибо за помощь @Masi! – ppostma1 18 October 2016 в 14:43
  • 4
    Спасибо, НО использование trim () должно быть правильным ответом – Husam 23 March 2017 в 16:34
  • 5
    Должен ли быть флаг u в регулярном выражении? – Soaku 19 August 2017 в 16:51

Вы можете сделать это, используя ereg_replace

  $ str = «Это новый метод когда-либо»;  $ newstr = ereg_replace ([[: space:]]) + ',' ', trim ($ str)): echo $ newstr // Результат - ThisIsNewMethodEver  
1
ответ дан Abdulla Nilam 15 August 2018 в 22:38
поделиться

Если вы хотите удалить все пробелы везде из $ tags, почему бы не просто:

  str_replace ('', '', $ tags);   

Если вы хотите удалить новые строки и такие, что потребуется немного больше ...

5
ответ дан camomileCase 15 August 2018 в 22:38
поделиться
  • 1
    если вы не присвоите результат переменной, это на самом деле ничего не принесет. – Paul Dixon 14 August 2009 в 20:43
  • 2
    Пол Диксон, что такое переменная? Я программирую, но я не знаю, что такое переменная ... Для чего это полезно? Могу ли я найти это в Интернете? Важно знать, что это значит? Почему они ставят $ перед именем? – I Wanna Know 21 March 2015 в 14:33

Чтобы удалить любое пустое , вы можете использовать регулярное выражение

  $ str = preg_replace ('/ \ s + /', '', $ str);   

См. также этот ответ для чего-то, что может обрабатывать пробелы в строках UTF-8.

132
ответ дан Community 15 August 2018 в 22:38
поделиться
  • 1
    +1, потому что это удаляет все пробелы, а не просто пробелы. – MitMaro 14 August 2009 в 20:41
  • 2
    +1 Это прекрасно, именно то, что мне нужно. Благодарю. – Radu Murzea 27 December 2012 в 20:36
  • 3
    Любые другие решения. Это (preg_replace) терпит неудачу для меня. – Kathir 28 February 2013 в 14:06
  • 4
    Это на порядок быстрее, чем замена их один за другим, вот почему :) – Paul Dixon 19 July 2013 в 09:29
  • 5
    Похоже, вы пытаетесь решить другую проблему для OP. Это решение для удаления всех пробелов из строки. – Paul Dixon 13 May 2014 в 15:12

Старая запись, но может быть выполнена следующим образом:

  if (! function_exists ('strim')): function strim ($ str, $ charlist = "", $ option = 0  ) {$ return = '';  if (is_string ($ str)) {// Переводить HTML-объекты $ return = str_replace ("& amp; nbsp;", "", $ str);  $ return = strtr ($ return, array_flip (get_html_translation_table (HTML_ENTITIES, ENT_QUOTES)));  // Выберите триммер опций ($ option) {// Сбрасываем пробелы (и другие символы) из начала и конца строки по умолчанию: case 0: $ return = trim ($ return, $ charlist);  ломать;  // Сбрасываем пробелы (и другие символы) с начала строки case 1: $ return = ltrim ($ return, $ charlist);  ломать;  // Сбрасываем пробелы (и другие символы) из конца строки 2: $ return = rtrim ($ return, $ charlist);  ломать;  }} return $ return;  } endif;   

Стандартные функции trim () могут быть проблематичными, когда появляются объекты HTML. Вот почему я написал функцию «Super Trim», которая используется для решения этой проблемы, а также вы можете выбрать обрезку со стороны начала, конца или стенда строки.

0
ответ дан Ivijan Stefan Stipić 15 August 2018 в 22:38
поделиться

Вы можете использовать функцию trim из php, чтобы обрезать обе стороны (влево и вправо)

  trim ($ yourinputdata, "");   

Или

  trim ($ yourinputdata);   

Вы также можете использовать

  ltrim () - удаляет пробелы или другие предопределенные символы с левой стороны строки rtrim () - удаляет пробелы или другие  предопределенные символы с правой стороны строки  

Система: PHP 4,5,7 Документы: http://php.net/manual/en/function.trim.php

7
ответ дан Kumar 15 August 2018 в 22:38
поделиться
  • 1
    Это должен быть правильный ответ, поскольку он изначально, именно то, что задает OP. Он маленький, чистый и «расширяемый», добавляя дополнительный символ, который нужно подрезать. – Louis Loudog Trottier 11 February 2017 в 15:04
  • 2
    Trim не удаляет пробелы ВНУТРИ строки, только слева и справа. BTW, пространство по умолчанию по умолчанию, вам не нужно указывать второй аргумент – Soaku 19 August 2017 в 16:53

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

1) Прежде всего, зарегистрируйте свою обертку (только один раз в файле, используйте ее как session_start ()):

  stream_wrapper_register (  'var', VarWrapper);   

2) Затем определите свой класс-оболочку (он очень быстро написан, не совсем корректен, но он работает):

  класс VarWrapper {protected $ pos  = 0;  защищенный $ content;  public function stream_open ($ path, $ mode, $ options, & amp; $ open_path) {$ varname = substr ($ path, 6);  глобальное $$ varname;  $ this- & gt; content = $$ varname;  return true;  } public function stream_read ($ count) {$ s = substr ($ this- & gt; content, $ this- & gt; pos, $ count);  $ this- & gt; pos + = $ count;  return $ s;  } public function stream_stat () {$ f = fopen (__ file__, 'rb');  $ a = fstat ($ f);  fclose ($ е);  if (isset ($ a [7])) $ a [7] = strlen ($ this- & gt; content);  return $ a;  }}  

3) Затем используйте любую функцию файла с вашей оболочкой в ​​протоколе var: // (вы можете использовать ее для include, require и т. д.):

   глобальный $ __ myVar;  $ __ myVar = 'Введите теги здесь';  $ data = php_strip_whitespace ('var: // __ myVar');   

Примечание. Не забудьте указать переменную в глобальной области (например, глобальный $ __ myVar)

2
ответ дан micropro.cz 15 August 2018 в 22:38
поделиться
  • 1
    Это сложно, новички, возможно, не хотят смотреть на это. Но для того, чтобы показать усилие, я подниму вас, чтобы -1 в этом сообщении был удален – Ironwind 18 September 2013 в 06:50
  • 2
    Да, я знаю, что он очень сложный, но он работает, и в некоторых случаях он действительно мощный. И, к сожалению, это единственный способ (вместо того, чтобы создавать временные файлы tempfiles, что является уродливым), как отправлять переменную в функции, которые работают только с файлами (а php_strip_whitespace - не единственный). Например, вы можете заменить код перед требованием - вы можете создать собственный «предварительный компилятор», для PHP, где вы можете делать все, что хотите. Я использую его, и он становится очень мощным и полезным в годы программирования. – micropro.cz 24 September 2013 в 15:19

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

  $ str = "  это строка ";  echo preg_replace_callback ('/ \ s + /', function ($ matches) {return "";}, $ str);   
1
ответ дан samehanwar 15 August 2018 в 22:38
поделиться
  • 1
    Хорошая практика в Stack Overflow - добавить объяснение, почему ваше решение должно работать. Для получения дополнительной информации см. [D0] Как ответить . – Samuel Liew♦ 15 December 2017 в 00:26
  • 2
    Можете ли вы добавить примеры, в каких случаях обратный вызов полезен с preg_replace ? – Léo Léopold Hertz 준영 15 December 2017 в 08:23

Иногда вам нужно удалить последовательные пробелы. Вы можете сделать это следующим образом:

  $ str = «Мое имя»;  $ str = preg_replace ('/ \ s \ s + /', '', $ str);   

Выход:

  Меня зовут  
24
ответ дан trante 15 August 2018 в 22:38
поделиться
  $ string = str_replace ("", "", $ string);   

Я считаю, что preg_replace будет искать что-то вроде [: space:]

11
ответ дан Tyler Carter 15 August 2018 в 22:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: