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

Форум Регулярные Выражения

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

 

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

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

тема: Помогите регуляркой взять строку и сделать ссылку
 
 автор: Yuryus   (02.09.2014 в 18:49)   письмо автору
 
 

Прошу помощи.
Есть плейлист

#EXTM3U
#EXTINF:-1,Трек1
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1
#EXTINF:-1,Трек2
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2

Задача удалить первую строку
А из последующих сформировать урлы.
<a href="stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1">Трек1</a>
<a href="stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2">Трек2</a>

Спасибо.

  Ответить  
 
 автор: Deed   (02.09.2014 в 20:24)   письмо автору
 
   для: Yuryus   (02.09.2014 в 18:49)
 


<html>
<head>
<title>Online PHP Script Execution</title>
</head>
<body>
<?php
   $str
='#EXTM3U
#EXTINF:-1,Трек1
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1
#EXTINF:-1,Трек2
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2'
;
$arr=explode("\n",$str);
for(
$i=0;$i<count($arr);$i++){
  
$arr[$i]=trim(strip_tags($arr[$i]));
  if(
strpos($arr[$i],'#')===0){
    
$arr[$i]=explode(',',$arr[$i]);
    
$arr[$i]=$arr[$i][1];
  }
  else{
    
$arr[$i]='<a href="'.$arr[$i].'">'.$arr[$i-1].'</a>';
    echo 
$arr[$i].'<br>';
  }
}
?>
</body>
</html>

  Ответить  
 
 автор: confirm   (02.09.2014 в 21:09)   письмо автору
 
   для: Deed   (02.09.2014 в 20:24)
 

А где в строке теги, зачем strip_tags?

  Ответить  
 
 автор: Deed   (02.09.2014 в 21:16)   письмо автору
 
   для: confirm   (02.09.2014 в 21:09)
 

Да я же не знаю, ЧТО он парсит. А вдруг html with br?
Так, на всякий случай.

  Ответить  
 
 автор: Yuryus   (02.09.2014 в 22:07)   письмо автору
 
   для: Deed   (02.09.2014 в 20:24)
 

Спасибо.
Прекрасно работает.

  Ответить  
 
 автор: confirm   (02.09.2014 в 21:11)   письмо автору
 
   для: Yuryus   (02.09.2014 в 18:49)
 

<?
$s
='#EXTM3U 
#EXTINF:-1,Трек1 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1 
#EXTINF:-1,Трек2 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2'


$s implode('<br>'array_map(function($v) {
    
$s explode(','$v[0]);
    return 
'<a href="'.trim($v[1]).'">'.$s[1].'</a>';
    
//если версия РНР не ниже 5.4, то одной строкой
    //return '<a href="'.trim($v[1]).'">'.explode(',', $v[0])[1].'</a>';
}, array_chunk(array_slice(explode("\n"$s), 1), 2)));

echo 
$s;

  Ответить  
 
 автор: Yuryus   (02.09.2014 в 21:38)   письмо автору
 
   для: confirm   (02.09.2014 в 21:11)
 

Спасибо. огромное!
Разбираю текстовый файлик в таком виде как показал.
Не мог понять сам принцип построения регулярки.
Сейчас есть от чего отталкиваться.
Спасибо.

  Ответить  
 
 автор: confirm   (02.09.2014 в 22:10)   письмо автору
 
   для: Yuryus   (02.09.2014 в 21:38)
 

В данном случае регулярные выражения вообще не применяются, где вы их увидели?

Это работает так:

$s = объединить_возвращаемый_массив_в_строку('объединение_через_<br>', обойти_массив_полученный_из_строки_$s(выполнить_функцию(в_функцию_через_переменную_$v_передаются_вложенные_массивы_массива_полученного_из_$s) { 
    //если версия РНР не ниже 5.4, то одной строкой 
    вернуть '<a href="'.удалить_лишнее_из(взять_второй_элемент_вложенного_массива_$v).'">'.разбить_на_массив('разбиение_по_,', первый_элемент_вложенного_массива_$v)[взять_из_массива_второй_элемент].'</a>'; 
}, разбить_массив_на_части(из_полученного_массива_взять_часть(разбить_строку(по_переносу_"\n", строка_исходного_текста), часть_массива_начинать_со_смещения_1), массив_разбивается_на_массивы_по_2_элемента)));


Отталкивайтесь от руководства РНР.

  Ответить  
 
 автор: Yuryus   (02.09.2014 в 22:27)   письмо автору
 
   для: confirm   (02.09.2014 в 22:10)
 

Спасибо.
Открыли глаза.
Очень познавательно т.к. несколько дней искал решения с регулярками. Только с недавнего времени интересуюсь такими программированием и еще успехи не очень.

Возможно поможете в дальнейшей разработке.
Получаю вывод
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1">Hits (Музыка)</a><br>
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх2">Sport Klub 1 (Спорт)</a><br>
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх3">Sport Klub 2 (Спорт)</a><br>
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх4">Sale (Развлекательные)</a><br>

Подскажите пожалуйста. Можно ли как то ограничить вывод по категориям.
Возможно без перезагрузки страницы.
Т.е. список категорий статичный и его можно указать в виде урлов или кнопок.

Спасибо.

  Ответить  
 
 автор: confirm   (02.09.2014 в 22:42)   письмо автору
 
   для: Yuryus   (02.09.2014 в 22:27)
 

А что значит ограничить и причем тут перезагрузка страницы, если вы из текста получаете нечто?

  Ответить  
 
 автор: Yuryus   (02.09.2014 в 22:50)   письмо автору
 
   для: confirm   (02.09.2014 в 22:42)
 

Сейчас выводится список из 400 ссылок.
Все данные находятся в массиве, $str= как в первом примере.
Но для удобства нужно было бы фильтровать по разделам
Например в ссылке есть указание категории:
Музыка, Спорт, Развлекательные и т.д.
Возможно ли сделать фильтрацию вывода по категориям на лету.
Например index.php?Спорт
И вывод только ссылок
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх2">Sport Klub 1 (Спорт)</a><br>
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх3">Sport Klub 2 (Спорт)</a><br>

Например index.php?Музыка
<a href="stream://ххххххххххххххххххххххххххххххххххх ххххххххххххххххххх1">Hits (Музыка)</a><br>
И т.д.
Да вот в php встречал функцию, которая выводит данные без перезагрузки всей страницы, это так к слову. Очень приятно, когда без рефреша выводятся данные.
Спасибо.

  Ответить  
 
 автор: confirm   (02.09.2014 в 23:20)   письмо автору
 
   для: Yuryus   (02.09.2014 в 22:50)
 

В РНР нет функций выводящих страницу без перезагрузки - РНР отдает страницу клиенту 1 раз, новый запрос от клиента, значит еще 1 раз, и т.д..

Без перезагрузки, это подразумевается перегрузить не все содержимое страницы, а только некую ее часть, запросив ее у сервера асинхронным запросом. Но к РНР это отношения не имеет, ему без разницы что отдавать, что запросят, то и отдаст, а часть ли это чего-то или все, ему не ведомо, его запросили, он отдал, соединение закрылось.
Асинхронные запросы делает браузер, посредством специального объекта, и называется такой механизм Ajax, и львиная работа в нем, это клиентский скрипт - Javascript.

Что касается фильтровать, сделать можно.

  Ответить  
 
 автор: Yuryus   (02.09.2014 в 23:33)   письмо автору
 
   для: confirm   (02.09.2014 в 23:20)
 

Спасибо большое.
Направьте пожалуйста на путь реализации фильтрации. Постараюсь сам реализовать.
Спасибо.

  Ответить  
 
 автор: confirm   (02.09.2014 в 23:48)   письмо автору
 
   для: Yuryus   (02.09.2014 в 23:33)
 

Проверять можно строку на наличие в ней подстроки, и сделать это можно либо stripos(), либо mb_stripos(), если кодировка в UTF8.
По условию должна возвращаться строка сформированная (ссылка и т.п. как в примере), если совпадение найдено, или 0, если нет. А объединению (implode('<br', тут)) должна предшествовать функция вычитающая из возвращаемого массива элементы равные 0 - array_diff().

  Ответить  
 
 автор: confirm   (03.09.2014 в 05:51)   письмо автору
 
   для: Yuryus   (02.09.2014 в 23:33)
 

Что никак не направляется? Вот таким образом:

<?
$s
='#EXTM3U 
#EXTINF:-1, Hits (Музыка) 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1 
#EXTINF:-1, Sport Klub 1 (Спорт) 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2
#EXTINF:-1, Sport Klub 2 (Спорт) 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх3
#EXTINF:-1, Sale (Развлекательные) 
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх3'


$f 'спорт'//выбираем что выводить

$s implode('<br>'array_diff(array_map(function($v) use($f) {
    
$s explode(','$v[0]);
    return 
mb_stripos($s[1], $f) ? '<a href="'.trim($v[1]).'">'.$s[1].'</a>' 0;
}, 
array_chunk(array_slice(explode("\n"$s), 1), 2)), array(0)));

echo 
$s;


А уж если безперезагрузка, и это клиент щелкает по списку выбирая что вывести, так это сделать функцией и Ajax запрос. Ну а чтобы постоянно не лопатить при этом текст, то на момент выдачи страницы клиенту он должен быть уже обработан и результат обработки не строка как показано, а массив, ключами которого будут являться цифровые значения опций списка. Текст опций списка это Спорт, Музыка и т.д..

  Ответить  
 
 автор: rurgil   (03.09.2014 в 09:09)   письмо автору
 
   для: confirm   (03.09.2014 в 05:51)
 

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

  Ответить  
 
 автор: Yuryus   (03.09.2014 в 20:16)   письмо автору
 
   для: confirm   (03.09.2014 в 05:51)
 

Спасибо.
Но получаю ошибку
Parse error: syntax error, unexpected T_FUNCTION, expecting ')' in /var/www/user/data/www/index.php on line 14

В строке
$s = implode('<br>', array_diff(array_map(function($v) use($f) {

Спасибо.

  Ответить  
 
 автор: confirm   (03.09.2014 в 20:19)   письмо автору
 
   для: Yuryus   (03.09.2014 в 20:16)
 

Какая у вас версия РНР?

  Ответить  
 
 автор: Yuryus   (03.09.2014 в 20:28)   письмо автору
 
   для: confirm   (03.09.2014 в 20:19)
 

PHP Version 5.2.17

  Ответить  
 
 автор: confirm   (03.09.2014 в 20:36)   письмо автору
 
   для: Yuryus   (03.09.2014 в 20:28)
 

Поэтому и ошибка. Если есть возможность выбрать более новую версию, то установите ее. При версии 5.3 эта ошибка исчезнет, а еще лучше перейти на версию 5.4. В противном случае так:

<?
$s
='#EXTM3U  
#EXTINF:-1, Hits (Музыка)  
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх1  
#EXTINF:-1, Sport Klub 1 (Спорт)  
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх2 
#EXTINF:-1, Sport Klub 2 (Спорт)  
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх3 
#EXTINF:-1, Sale (Развлекательные)  
stream://ххххххххххххххххххххххххххххххххххх хххххххххххххххххх3'
;  

$f 'Sport'//выбираем что выводить 

function add_link($v) {
    global 
$f;
    
$s explode(','$v[0]); 
    return 
stripos($s[1], $f) ? '<a href="'.trim($v[1]).'">'.$s[1].'</a>' 0;
}

$s implode('<br>'array_diff(array_map('add_link'array_chunk(array_slice(explode("\n"$s), 1), 2)), array(0))); 

echo 
$s;


И выбирать Спорт и т.п., лучше по английскому названию, они же ведь тоже есть, при этом нужно будет сравнивать один байт на символ, а не несколько, даже в случае UTF, это быстрее.

  Ответить  
 
 автор: Yuryus   (03.09.2014 в 20:38)   письмо автору
 
   для: confirm   (03.09.2014 в 20:36)
 

Спасибо.
Низкий Вам поклон.
Буду пробовать.

По русски тоже сейчас категории выбираются.
Спасибо.

  Ответить  
 
 автор: confirm   (04.09.2014 в 10:40)   письмо автору
 
   для: Yuryus   (03.09.2014 в 20:38)
 

Сравнивайте английский вариант, как в коде:

$f = 'Sport'; //выбираем что выводить

и проверка:

return stripos($s[1], $f) ...

Это выгоднее будет при UTF кодировке сайта.

  Ответить  
 
 автор: Yuryus   (18.12.2014 в 15:54)   письмо автору
 
   для: confirm   (04.09.2014 в 10:40)
 

Спасибо.

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

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