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

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

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

 

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

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

тема: Замена определенного повторения через регулярное выражение
 
 автор: TanTaL91   (05.11.2013 в 23:35)   письмо автору
 
 

Добрый день уважаемые форумчане. Подскажите пожалуйста, как сделать замену в строке:

$content = '[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]';


Мне нужно в зависимости от исходного числа (1,2,3 - но может табов будет и больше), заменять "vc_tab" на "vc_tab tab="active""

Буду очень признателен за помощь.

  Ответить  
 
 автор: duhon   (06.11.2013 в 11:59)   письмо автору
 
   для: TanTaL91   (05.11.2013 в 23:35)
 

$result = preg_replace('/vc_tab(?=[^\]]*Tab \d+)/', 'vc_tab tab="active"', $content);

  Ответить  
 
 автор: TanTaL91   (06.11.2013 в 15:26)   письмо автору
 
   для: duhon   (06.11.2013 в 11:59)
 

Спасибо, но не помогло.

Решение нашел вот в этом:
$string = '[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]';
$result = preg_replace("/(vc_tab .*?){3}/is", 'vc_tab active_tab', $string); 


Но есть беда, он почему то режет строку... в результате, чем выше цифра, тем больше он выводит.

  Ответить  
 
 автор: Deed   (06.11.2013 в 19:13)   письмо автору
 
   для: TanTaL91   (06.11.2013 в 15:26)
 

http://phpfiddle.org/main/code/5bt-x5v:

<?php
$content 
'[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]'
echo 
preg_replace("/vc_tab( title=\"Tab \d+?\")/","vc_tab tab=\"active\"$1",$content);
?>

  Ответить  
 
 автор: TanTaL91   (06.11.2013 в 22:01)   письмо автору
 
   для: Deed   (06.11.2013 в 19:13)
 

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

  Ответить  
 
 автор: Deed   (06.11.2013 в 22:17)   письмо автору
 
   для: TanTaL91   (06.11.2013 в 22:01)
 

Когда "выбрал пользователь", как выглядит его выбор?
Тут, наверное, нужен простой str_replace() http://php.net/manual/ru/function.str-replace.php

  Ответить  
 
 автор: TanTaL91   (06.11.2013 в 22:28)   письмо автору
 
   для: Deed   (06.11.2013 в 22:17)
 

Все очень просто, человек вбивает цифру, 1, 2 , 3. И в зависимости от цифры нужному из [vc_tab добавляется уже класс.

Если вводит цифру 1:
[vc_tab tab="active" title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]


Если вводит цифру 2:
[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab tab="active" title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]

  Ответить  
 
 автор: Deed   (06.11.2013 в 22:43)   письмо автору
 
   для: TanTaL91   (06.11.2013 в 22:28)
 


<?php
$str
='[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]';
$for_tab=2;
$new_str=str_replace('vc_tab title="Tab '.$for_tab.'"','vc_tab tab="active" title="Tab '.$for_tab.'"',$str);
echo 
$new_str;
?>


http://phpfiddle.org/main/code/r62-5cq

  Ответить  
 
 автор: TanTaL91   (06.11.2013 в 23:27)   письмо автору
 
   для: Deed   (06.11.2013 в 22:43)
 

Тайтл постоянно меняется, на нем нельзя завязывать эту систему... Так как Tab 1 и тд... это для примера :(

  Ответить  
 
 автор: TanTaL91   (06.11.2013 в 23:38)   письмо автору
 
   для: TanTaL91   (06.11.2013 в 23:27)
 

В принципе, подошло бы и такое решение:
Что бы сначала всем раздал active_tab=\"false\"
А потом у нужного заменил на true
 
$content = '[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]'; 
$content = preg_replace("/vc_tab( title=\"Tab \d+?\")/","vc_tab active_tab=\"false\"$1",$content);
$content = preg_replace("ТУТ ЧТО ТО НАПИСАТЬ","true",$content);
echo $content;


Было бы волшебно!)

  Ответить  
 
 автор: Deed   (06.11.2013 в 23:56)   письмо автору
 
   для: TanTaL91   (06.11.2013 в 23:38)
 


<?php
$str
='[vc_tab title="Tab 1" tab_id="1383336405-1-60"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383336405-2-9"][vc_column_text][/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383336581182-2-7"][vc_column_text][/vc_column_text][/vc_tab]';
$for_tab=2;
$nmbr=preg_match_all('/\[vc_tab.+?\/vc_tab\]/',$str,$m);
if(
$for_tab>$nmbr){ //если введенное число больше, чем нужно
    
echo "Your number is incorrect!";
}
else{
    
$m[0][$for_tab-1]=str_replace('[vc_tab','[vc_tab  tab="active"',$m[0][$for_tab-1]);
    
$new_str=implode("",$m[0]);
    echo 
$new_str;
}
?>


http://phpfiddle.org/main/code/wep-987

  Ответить  
 
 автор: TanTaL91   (07.11.2013 в 00:37)   письмо автору
 
   для: Deed   (06.11.2013 в 23:56)
 

Спасибо Вам за помощь!

  Ответить  
 
 автор: TanTaL91   (07.11.2013 в 07:45)   письмо автору
 
   для: Deed   (06.11.2013 в 23:56)
 

А если там имеет внутри контент, то уже не работает(

[vc_tabs active_tab="2"][vc_tab title="Tab 1" tab_id="1383736004-1-85"][vc_column_text]

I am text block. Click edit button to change this text.

[/vc_column_text][/vc_tab][vc_tab title="Tab 2" tab_id="1383736004-2-62"][vc_column_text]

I am text block. Click edit button to change this text.

[/vc_column_text][/vc_tab][vc_tab title="Tab 3" tab_id="1383736910489-2-6"][vc_column_text]

I am text block. Click edit button to change this text.

[/vc_column_text][/vc_tab][/vc_tabs]

  Ответить  
 
 автор: TanTaL91   (07.11.2013 в 08:02)   письмо автору
 
   для: TanTaL91   (07.11.2013 в 07:45)
 

Добавил модификатор S и все заработало, привожу пример, может кому то будет полезно:

$nmbr=preg_match_all('/\[vc_tab (.*)vc_tab\]/s',$content,$content_arrow); 

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

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