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

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Поубирать лишние пробелы

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


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

> Описание: интересная задачка
Robotex
Отправлено: 06 Июня, 2009 - 18:18:26
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




Хм, есть такая проблемка, которую мне никак не удается решить.

Есть текст, в котором отступы сделаны пробелами, например:
CODE (text):
скопировать код в буфер обмена
  1.  
  2. <xml>
  3.   <header>
  4.  
  5.   </header>
  6.   <main>
  7.     <p>
  8.       Some text
  9.       More text
  10.     </p>
  11.   </main>
  12.   <footer>
  13.  
  14.   </footer>
  15. </xml>
  16.  

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

Так вот, как бы поотсекать все лишнее (а то парсер обрабатывает их и портит вид документа)?

Код
CODE (text):
скопировать код в буфер обмена
  1.  
  2. $s_xml=str_replace("\t",'',$s_xml);
  3.  
  4.   preg_match_all('~[ ]{2,}~', $s_xml, $a);
  5.  
  6.   for($i=0;$i<count($a);$i++)
  7.     $s_xml=str_replace($a[$i], '', $s_xml);
  8.  

похож на решение, но он не работает, когда между тегами один пробел. А заменить все > < на >< тоже нельзя (вдруг там написано <b>Some text</b> <i>More text</i>)
(Добавление)
Блин, форум пробелы поубирал ))
 
 Top
ALEN
Отправлено: 06 Июня, 2009 - 19:12:46
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Не люблю велосипеды....
simplexml_load_string() - не помогает?

CODE (text):
скопировать код в буфер обмена
  1. <?php
  2. $xmlstr = <<<XML
  3. <xml>
  4. <header>
  5.  
  6. </header>
  7. <main>
  8. <p>
  9. Some text
  10. More text
  11. </p>
  12. </main>
  13. <footer>
  14.  
  15. </footer>
  16. </xml>
  17. XML;
  18.  
  19.  
  20. $xml = simplexml_load_string($xmlstr);
  21.  
  22. echo $xml->main->p; // "Some text More text"
  23. ?>

(Отредактировано автором: 06 Июня, 2009 - 19:19:17)

 
 Top
Гость
Отправлено: 06 Июня, 2009 - 20:51:15
Post Id


УДАЛЁН










Может опять воспользоваться поиском вперед в регулярном выражении?
 
 Top
ALEN
Отправлено: 06 Июня, 2009 - 21:02:56
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




JustUserR
ЫЫ, зачем регулярное выражение где не нужно использовать - дал же отличную функцию. С помощью нее можно любую скобку отковырнуть.
 
 Top
Гость
Отправлено: 07 Июня, 2009 - 10:54:30
Post Id


УДАЛЁН










ALEN Да просто к слову пришлось чтобы человек знал
 
 Top
Robotex
Отправлено: 07 Июня, 2009 - 17:13:07
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




- Доктор, у меня рука болит. Есть лекарство?
- Зачем изобретать велосипед, отрезать не пробовали?


У меня уже написан парсер и использование SimpleXML вынудило бы полностью переписать его (да и как спрашивается перебирать объекты в цикле?)
 
 Top
vitaliy_mad
Отправлено: 07 Июня, 2009 - 17:46:51
Post Id


Участник


Покинул форум
Сообщений всего: 1107
Дата рег-ции: Окт. 2008  
Откуда: Украина, Мариуполь


Помог: 0 раз(а)




preg_replace('/(?<!=\>)[\s]+(?!=\<)/Us','',$str); попробуй
но оно уберет все пробелы, если они не между > и <

хотя можно еще так попробовать:
preg_replace('/(?<!=\>)[\s]{2,}(?!=\<)/Us','',$str);

а если так:
preg_replace('/[\s]{2,}/s',' ',$str); - замент все пробелы если их больше или равно 2 на 1 пробел

(Отредактировано автором: 07 Июня, 2009 - 17:53:02)

 
 Top
ALEN
Отправлено: 07 Июня, 2009 - 21:59:50
Post Id



Участник


Покинул форум
Сообщений всего: 1459
Дата рег-ции: Авг. 2008  
Откуда: Крым


Помог: 11 раз(а)




Robotex
Конечно Ваше дело, но мудрить и обрабатывать пробелы...

А вообще, если я правильно понял проблему, то нужно обрабатывать только двойные пробелы, а так же перенос строки и табуляцию.

P.S. На мое мнение если парсер с XML - то лучше чем SimpleXML ничего не найти. Самый короткий и быстрый вариант. Если нам например новости по RSS нужно парсерить, то можно использовать функцию foreach. Кроме того Вы сразу лишаете себя множества будущих проблем. Ну еще раз повторяюсь, это Ваше дело. Конечно бывает интересней, когда огромный романтизм.


Пример работы:
CODE (text):
скопировать код в буфер обмена
  1. <?php
  2. header('Content-type: text/html; charset=UTF-8');
  3. $xml = simplexml_load_file("http://news.yandex.ru/index.rss");
  4. foreach ($xml->channel->item as $item) {
  5.    echo '<li><b>'.$item->title.'</b><br />'.$item->description.'</li>';
  6. }
  7. ?>


И докажешь, что другой вариант парсера более удобен, быстрей и качественней???

(Отредактировано автором: 07 Июня, 2009 - 22:10:48)

 
 Top
Robotex
Отправлено: 07 Июня, 2009 - 23:01:30
Post Id


Новичок


Покинул форум
Сообщений всего: 22
Дата рег-ции: Март 2009  


Помог: 0 раз(а)




ALEN пишет:
На мое мнение если парсер с XML - то лучше чем SimpleXML ничего не найти. Самый короткий и быстрый вариант.


Я ж не спорю ))) Просто когда я писал парсер, то пользовался втроенным парсером ПХП. Но если вы расскажете, как преобразовать то, что вернет SimpleXML в массив вида:

CODE (text):
скопировать код в буфер обмена
  1.  
  2. array(text => 'Bla bla bla',
  3. tags => array(
  4. 0 => array(
  5. tag => 'p',
  6. fcFirst => 0,
  7. fcLast => 11
  8. ),
  9. 1 => array(
  10. tag => 'b'
  11. fcFirst => 0,
  12. fcLast => 3
  13. )
  14. )
  15. );
  16.  

(где fcFirst первый символ в тексте, с которого начинается данный тег, fcLast - последний символ+1)
то я не пожалею времени и перепишу Улыбка

Просто я не очень умею обрабатывать объекты в циклах...
(Добавление)
Попробовал только что SimpleXML - пробелы остались на месте
 
 Top
Гость
Отправлено: 07 Июня, 2009 - 23:35:54
Post Id


УДАЛЁН










Кстати а в самом это SimpleXML ведь есть вырезалка проблеов?
Зачем же вы пользовались какимто сторонними средставми
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB