Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
MySQL 5. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Социальная инженерия и социальные хакеры. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В. PHP Puzzles. Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: preg_split
 
 автор: btr   (22.09.2013 в 16:27)   письмо автору
 
 

Здравствуйте.

дано:
$tmp_str = '<option value="167">aaa</option><option value="145">bbb</option>';


надо вытащить в массив ааа и bbb

делаю:
$out = preg_split("#(<.+>)#",$tmp_str,PREG_SPLIT_NO_EMPTY);

print_r($out);


получаю:
Array ( [0] =>
aaa
bbb
 ) 


почему то оба значения запихиваются в одну ячейку $out[0]

подскажите, что не так делаю?

  Ответить  
 
 автор: Zezst   (22.09.2013 в 18:19)   письмо автору
 
   для: btr   (22.09.2013 в 16:27)
 

У вас регулярка вообще ничего не вырезает. Сделайте так:
print_r(htmlentities($out['0']))


У меня вышел такой результат:
<option value="167">aaa</option><option value="145">bbb</option>

  Ответить  
 
 автор: btr   (22.09.2013 в 18:31)   письмо автору
 
   для: Zezst   (22.09.2013 в 18:19)
 

а смысл?
я хотел бы информацию без штмл получить.

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

я объясняю свою регулярку так: начинается с символа < содержит от одного и больше любых символов и заканчивается символом >

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

где я ошибаюсь?

  Ответить  
 
 автор: Zezst   (22.09.2013 в 18:55)   письмо автору
 
   для: btr   (22.09.2013 в 18:31)
 

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

Вот так должна выглядеть ваша строка:
$out = preg_split("([<.+>])",$tmp_str,-1,PREG_SPLIT_NO_EMPTY);


и соответственно вывод:
Array
(
    [0] => option value="167"
    [1] => aaa
    [2] => /option
    [3] => option value="145"
    [4] => bbb
    [5] => /option
)


Осталось понять как выкинуть не нужное.

  Ответить  
 
 автор: btr   (22.09.2013 в 20:38)   письмо автору
 
   для: Zezst   (22.09.2013 в 18:55)
 

большое спасибо за ответ
судя по нему, в моем понимании есть дефект.
почему "в одну строку"?
не могли бы Вы подробнее объяснить что я не так делаю

  Ответить  
 
 автор: Zezst   (22.09.2013 в 21:02)   письмо автору
 
   для: btr   (22.09.2013 в 20:38)
 

Хы. Мне бы самому понять.
Собственно теперь, осталось разобраться с регуляркой. К сожалению, сам тоже не особо силен.
Мы убедились, что функция в полне рабочая. Теперь вам, лучше будет обратиться в раздел про регулярные выражения, наверняка есть способ стереть, то что внутри угловых скобок.
Большим помочь не смогу.

  Ответить  
 
 автор: confirm   (22.09.2013 в 21:32)   письмо автору
 
   для: btr   (22.09.2013 в 16:27)
 

Разбивать на массив, значит удалять потом лишнее. А если так, есть в строке неизменное, по которому и нужно разбивать - </option>, и делать это лучше explode. Убрать лишнее, это значит удалить из элементов массива оставшийся html-код.
<?
$tmp_str 
'<option value="167">aaa</option><option value="145">bbb</option>';
$tmp_str explode("</option>"$tmp_str, -1);
$tmp_str array_map('strip_tags'$tmp_str);
print_r($tmp_str);

А рег. выражением, так это найти между > и <, и запомнить.

  Ответить  
 
 автор: btr   (23.09.2013 в 08:06)   письмо автору
 
   для: confirm   (22.09.2013 в 21:32)
 

большое спасибо, как всегда просто и надежно :)

а вот с пониманием у меня туго, что я не так понимаю в сплите? :(

  Ответить  
 
 автор: confirm   (23.09.2013 в 18:40)   письмо автору
 
   для: btr   (23.09.2013 в 08:06)
 

Вопрос другой - зачем для разбиения в данном случае preg_split? Во-первых читайте, что пишут разработчики:
Если вам не нужна мощь регулярных выражений, вы можете выбрать более быстрые (хоть и простые) альтернативы наподобие explode() или str_split().
Во-вторых вы ведь поучите тоже самое, что и при explode(), то есть далее все равно убирать лишнее, и в чем выгода?

Уж если PCRE использовать, тогда сразу искать искомое. Именно для такого примера достаточно шаблона />(\w+)</, и получим массив готовых данных. Но реально то не так будет или может быть, а поэтому шаблон будет посерьезнее. Хотите так, значит в раздел рег. выражений с этим вопросом, описывая все возможные условия своего списка.

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования