Важный вопрос, я думаю, то, что базы данных разработаны и настроены для основанных на наборе операций - выбирает, обновляет и удаляет больших объемов данных на единственном быстром шаге на основе отношений в данных.
программное обеспечение В оперативной памяти, с другой стороны, разработано для отдельных операций, таким образом, цикличное выполнение по ряду данных и потенциально выполнения различных операций на каждом объекте последовательно - то, в чем это является лучшим.
Цикличное выполнение не то, что база данных или архитектура хранения разработаны для, и даже в SQL Server 2005, Вы не собираетесь добираться, производительность где угодно близко к Вам добираются, если Вы вытаскиваете набор основных данных в пользовательскую программу и делаете цикличное выполнение в памяти, с помощью объектов/структур данных, которые максимально легки.
mb_language('uni');
mb_internal_encoding('UTF-8');
$s = ' ';
if (strlen(preg_replace('/\s+/u','',$s)) == 0) {
echo "String is empty.\n";
}
Если это не сработает, я предлагаю сделать это
$s = ' ';
if (strlen(trim(preg_replace('/\xc2\xa0/',' ',$s))) == 0) {
echo "String is empty.\n";
}
Эти решения были протестированы на разных платформах.
Флаг u указывает preg_replace () лечить строка как многобайтовая строка, а именно utf-8
Символ представляет собой неразрывный пробел C2A0 и может быть сгенерирован с помощью alt + 0160.
Может быть, вы делаете что-то еще, что портит результаты? Ваш тест возвращает 0
print_r(strlen(trim(' ')));
И это ожидаемое поведение trim .
Эта функция возвращает строку с пробелы удалены с самого начала и конец ул. Без второго параметр trim () удалит эти символы:
- «» (ASCII 32 (0x20)), обычный пробел.
- «\ t» (ASCII 9 (0x09)), табуляция.
- «\ n» (ASCII 10 (0x0A) ), новая строка (перевод строки).
- «\ r» (ASCII 13 (0x0D)), возврат каретки.
- «\ 0» (ASCII 0 (0x00)), NUL-байт.
- «\ x0B» (ASCII 11 (0x0B)), вертикальная табуляция.
ОБНОВЛЕНИЕ:
Глядя на ваш прикрепленный код, я заметил, что у вас есть дополнительный символ между двумя пробелами.
Это результат работы hexdump -C
$ hexdump -C space.php
00000000 3c 3f 0d 0a 70 72 69 6e 74 5f 72 28 73 74 72 6c |<?..print_r(strl|
00000010 65 6e 28 74 72 69 6d 28 27 20 c2 a0 20 27 29 29 |en(trim(' .. '))|
00000020 29 3b 0d 0a 3f 3e |);..?>|
00000026
И это результат od , только с этим символом в файле.
$ od space.php
0000000 120302
0000002
trim не удалит это пространство, потому что ... ну, это не пространство. Это хороший справочник о том, как определять необычных персонажей.
О, и чтобы ответить на ваш обновленный вопрос, просто используйте пусто , как сказал Питер.
Достаточно простого preg_match ():
if(preg_match('/^\s+$/', $str)) == 1){
die('there are only spaces!');
}
Вы можете использовать функцию count_chars
или функцию substr_count
.
Я думаю, что самый быстрый способ - это обрезать ведущие пробелы ( ltrim
быстро завершится ошибкой, если есть другие символы) и сравнить результат с пустой строкой:
# Check if string consists of only spaces
if (ltrim($string, ' ') === '') {
Вы хотите знать, содержит ли строка пробел?
if(strpos($string, ' ') !== false) echo $string.' contains a space';
Как насчет этого ...
$str = preg_replace('/\s\s+/', '', $str);
Или этого ...
$str = str_replace(array("\n", "\r", "\t", " ", "\o", "\xOB"), '', $str);
if(strlen(trim($_POST['foobar'])) == 0){
die('the user didn\'t input anything!');
}
пустым
также будет
как
$bar = trim($_POST['foobar']);
if(empty($bar)){
die('the user didn\'t input anything!');
}
если trim($var) не работает, то $var может не быть строкой. поэтому сначала преобразовываем в string
$var1 = string($var). а потом trim($var1).