Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: Регулярки, удаление пробелов
Форумы портала PHP.SU » » Вопросы новичков » Регулярки, удаление пробелов

Страниц (1): [1]
 

1. Tox - 23 Июня, 2012 - 12:30:03 - перейти к сообщению
Есть строка:
'любойТекст0 любойТекст1 "Спец Текст0" любойТекст2 "Спец Текст1" ' - ну и так далее
Пробовал str_replace(' ','',$string), но оно удаляет все пробелы, а нужно, чтобы удалялись пробелы только внутри "". С explode тоже самое. Как это можно сделать?
2. fdr21 - 23 Июня, 2012 - 12:48:43 - перейти к сообщению
По ходу так)))
PHP:
скопировать код в буфер обмена
  1. $text = 'любойТекст0 любойТекст1 "text texx0" любойТекст2 "Спец Текст1" ';
  2. $text = preg_replace('~("[\w\dА-ЯЁ]+)\s+([\w\dА-ЯЁ]+")~ius', '\1\2', $text);
  3. var_dump($text);
  4. // результат
  5. // string 'любойТекст0 любойТекст1 "texttexx0" любойТекст2 "СпецТекст1" ' (length=100)
  6.  
3. Tox - 23 Июня, 2012 - 13:22:19 - перейти к сообщению
Warning: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Compilation failed: invalid UTF-8 string at offset 8
+ текст в строке включает в себя a-z
4. fdr21 - 23 Июня, 2012 - 14:02:51 - перейти к сообщению
если только a-z....
измените шаблон
~("[a-z]+)\s+([a-z]+")~si
Цитата:
Warning: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Compilation failed: invalid UTF-8 string at offset 8

может вам нужно перевести файл скрипта в UTF-8, хотя не совсем уверен почему такая ошибка выходит)
5. armancho7777777 - 23 Июня, 2012 - 14:04:06 - перейти к сообщению
.
6. Tox - 23 Июня, 2012 - 15:00:59 - перейти к сообщению
я чуть-чуть изменил, все равно не получается:
PHP:
скопировать код в буфер обмена
  1. $text = 'text0 5673 "text1 space text2" " space text3 " " text4 space "';
  2. $text = preg_replace('~("\w\dA-Z+)\s+(\w\dA-Z+")~ius', '\1\2', $text);
  3. var_dump($text);
  4. // результат
  5. //string(62) "text0 5673 "text1 space text2" " space text3 " " text4 space ""
  6.  
  7.  

В чем ошибка?
7. fdr21 - 23 Июня, 2012 - 20:10:24 - перейти к сообщению
Цитата:
В чем ошибка?

изменили не так, и потом у вас в строке разное количество слов, для удаление пробелов из текста заключенного в двойные кавычки...
Попробуйте так!
PHP:
скопировать код в буфер обмена
  1. $text = 'text0 5673 "text1 space05 text2" " space text3 " " text4 space "';
  2.         '~"(.*?)"~s',
  3.         create_function(
  4.                 '$matches',
  5.                 'return preg_replace("~\s*~s", "", $matches[0]);'
  6.         ),
  7.         $text
  8. );
  9. var_dump($word);
  10. // результат
  11. // string 'text0 5673 "text1space05text2" "spacetext3" "text4space"' (length=56)
8. Champion - 23 Июня, 2012 - 21:32:20 - перейти к сообщению
А почемму бы циклом не перегнать старую строку в новую писимвльно, считая по дороге кавычки и пропускач пробелы тогда, когда надо? Это, по-моему, самое простое, очевидное и унгиверсальное решение
9. snikers987 - 23 Июня, 2012 - 21:40:31 - перейти к сообщению
Цитата:
Warning: preg_replace() [<a href='function.preg-replace'>function.preg-replace</a>]: Compilation failed: invalid UTF-8 string at offset 8


Указан модификатор для работы с юникодом(u), а строка передаваемая preg_replace() не в юникоде
10. fdr21 - 23 Июня, 2012 - 22:20:46 - перейти к сообщению
Champion пишет:
А почемму бы циклом не перегнать старую строку в новую писимвльно, считая по дороге кавычки и пропускач пробелы тогда, когда надо? Это, по-моему, самое простое, очевидное и унгиверсальное решение

Очень интересно, можете кусок кода предоставить!?))
11. DlTA - 23 Июня, 2012 - 23:02:48 - перейти к сообщению
а нужно удалять пробелы в кавычках полностью
или же может быть хватит удаления множественных пробелов?
может хватит варианта
12. armancho7777777 - 23 Июня, 2012 - 23:57:49 - перейти к сообщению
PHP:
скопировать код в буфер обмена
  1.  
  2. $str = 'слово текст02 "10слово  слово  два  слова  и  ещё   текст10" 02слово слово текст';
  3. $str .= 'слово текст12 "11слово  слово  два  слова  и  ещё   текст11" 12слово слово текст';
  4. $str .= 'слово текст22 "12слово  слово  два  слова  и  ещё   текст12" 22слово слово текст';
  5.  
  6.  
  7. function callback($math)
  8. {
  9.         // Заменить последовательность пробелов, переносов строк и т.д. на один пробел
  10.         return $math[1].preg_replace('~[\s]+~', ' ', $math[2]).$math[3];
  11.        
  12.         // ...или же удалить все пробелы, переносы строк и т.д.
  13.         // return $math[1].preg_replace('~[\s]+~', '', $math[2]).$math[3];
  14. }
  15.  
  16. $pattern = "~";
  17. $pattern .= "([\w\W]+\")";   // Части подстрок до открывающих ковычек
  18. $pattern .= "([\w\W]+)";     // Подстроки между ковычками
  19. $pattern .= "(\"[\w\W]+)";   // Части подстрок после закрывающих ковычек
  20. $pattern .= "~Usi";
  21.  
  22. echo preg_replace_callback($pattern, "callback", $str);
  23.  
  24.  


Ну и тоже самое по короче ...

PHP:
скопировать код в буфер обмена
  1.  
  2.                      "~([\w\W]+\")([\w\W]+)(\"[\w\W]+)~Usi",
  3.                      create_function(
  4.                          '$math',
  5.                          'return $math[1].preg_replace("~[\s]+~", "", $math[2]).$math[3];'
  6.                      ),
  7.                      $str
  8.           );
  9.  


DlTA пишет:
может хватит варианта


Заменить 2 пробела на один?
Ну уж тогда заменить все пробелы на один:
PHP:
скопировать код в буфер обмена
  1. $text = preg_replace("~ +~", " ", $text);

или
PHP:
скопировать код в буфер обмена
  1. $text = preg_replace("~[\s]+~", " ", $text);
13. Champion - 24 Июня, 2012 - 21:38:40 - перейти к сообщению
fdr21 пишет:
Очень интересно, можете кусок кода предоставить!?))

PHP:
скопировать код в буфер обмена
  1. <?PHP
  2.         $str = 'vnjfh "nkdjbvkf  fngjkbg kfjt" kjbndkfvb "dkjfb  bvkjbgkd  " dfbk';
  3.         $dst = '';
  4.         $inQuotes = 0;
  5.         for($i = 0, $cn = strlen($str); $i < $cn; ++$i) {
  6.                 $inQuotes ^= ($str[$i] === '"');
  7.                 $dst .= ($str[$i] !== ' ' || !$inQuotes) ? $str[$i] : '';
  8.         }
  9.         die($dst);
  10.        

 

Powered by ExBB FM 1.0 RC1