Имя: Пароль:
IT
 
Помогите по regex, пжлста.
,
0 DES
 
28.05.13
15:09
есть строка в которой содержатся теги {lang xx}{/lang}
Между тегами может быть расположен любой текст.
xx - может быть любой 2-х буквенной строкой.
Если xx совпадает с фильтром, то нужно вернуть строку состоящую из.
символов не обрамленных любыми тегами +  символы обрамленные тегами с совпадающими XX и фильтр

пример:
ИсходнаяСтрока="Это строка, она может быть на {lang ru}русском{/lang}{lang en}английском{/lang} языке и не на {lang ru}русском{/lang} {lang en}английском{/lang} языке."
Если СтрФильтр="ru"  Тогда "Это строка, она может быть на русском языке и не на русском языке."
а
Если СтрФильтр="en"  Тогда "Это строка, она может быть на английском языке и не на английском языке."

Эта конструкция PHP выполняет это
$lang_code = "ru";
$regex = "#{lang ".$lang_code."}(.*?){\/lang}#is";
$text = preg_replace($regex,'$1', $text);
$regex = "#{lang [^}]+}.*?{\/lang}#is";
$text = preg_replace($regex,'', $text);
return $text;

Вопрос.
Бывает что в строке нет закрывающего тега {/lang}.
как на PHP проверить его наличие и добавить если его нет.
таких тегом в строке может быть несколько

это правильно - яяяя{lang xx}яяяяя{/lang}яяя{lang xx}яяя{/lang}{lang xx}яяяя{/lang}
тут добавить нужно - яяяя{lang xx}яяя{/lang}яяя{lang xx}яяя{/lang}яяя{lang xx}яяяяя
1 DES
 
28.05.13
15:45
или кто знает сайт на котором можно потестить PHP код?
2 drcrasher
 
28.05.13
15:48
поставь локально апач с пхп и играйся
например, http://www.appservnetwork.com/
3 kokamoonga
 
28.05.13
16:43
4 DES
 
28.05.13
16:58
хорошо, ладно
Как на PHP заменить последнее совпадение найденное в строке?
пример
"вывыаыва2ываываыва2ыаыаываы2пвпва"
как сделать
"вывыаыва2ываываыва2ыаыаываы3пвпва"
?
5 kokamoonga
 
28.05.13
19:25
(4) могу заблуждаться, но голыми regexp вроде никак.

а просто на php вот например http://ideone.com/TPECgZ
6 kokamoonga
 
28.05.13
19:29
(0) (4)  автор, а поделись секретом, зачем вообще все эти пляски?
7 Ковычки
 
28.05.13
19:38
на сколько маразм \x
8 Ковычки
 
28.05.13
19:38
да и вернется массив
9 DES
 
28.05.13
20:11
(6) нада
(5) спс
10 DES
 
29.05.13
00:32
опа, оказалось не так просто.
нужно попарно отслеживать теги в строке внутри подстрок ограниченных двойными кавычками, а их может быть несколько, и если один тег не закрылся до конца подстроки ",  то тогда его закрыть {/lang}"
11 kokamoonga
 
29.05.13
00:57
(10) не переживай, этого никто не мог предвидеть.
ответь лучше на вопрос в (6)
12 DES
 
29.05.13
10:24
(11) Jommla 2.5 + Kunena 3.0 + easylanguage

многоязычный сайт

в любом месте теги {} lfd.n возможность выводить только текст определенного языка, в зависимости от переключателя.
Но есть проблемс.
easylanguage плагин обрабатывает всю страницу перед передачей.
находит там {}{/} и выполняет то, что описано выше.
НО!!!
Kunena формирует тег title = "траляля..." из текста путем обрезания текста и добавлением "...". Поэтому закрывающий тег {/lang} может быть отрезан.
А easylanguage не находя его курочит HTML и передает обломки.
Я не знаю как отключить формирование тега title  (я только месяц как про joomla услышал и это мой первый сайт на CMS, раньше писал в сайт в блокноте, и без PHP)
Пока я нарыл как увеличить размер обрезки текста для title и это временно решило проблему, но при добавлении темы с большим текстом - проблемы вылезут опять.
Поэтому нужно впендюривать закрываюший тег {/lang}, при его отсутствии, до обработчика easylanguage.
13 DES
 
29.05.13
14:13
понятно объяснил ?
14 kokamoonga
 
01.06.13
00:49
(13) вполне. это жесть конечно.

еще какие-то теги там могут присутствовать?
15 DES
 
01.06.13
01:28
Да, перехватил формирование title до easylanguage.
Теперь нормально. Правда теперь необъяснимый баг появился такого же типа. Не русском языке страница нормально формируется, а на альтернативном - косячит также, как если бы кусок кода страницы вырезался произвольным образом.
16 DES
 
01.06.13
01:30
с чего бы начать вкуриваться в regex ?
17 DES
 
01.06.13
11:06
Мама, я все починил (с)
Но все умрет при обновлении Kunena.
(14)Если есть желание разобраться с этим, то чинить нужно такое.

div class="klatest-subject ks">
Последнее сообщение: <a href="/tighina/index.php?option=com_kunena&amp;view=topic&amp;catid=16&amp;id=16&amp;Itemid=196&amp;lang=ro#16" rel="nofollow" title="View Last Post in Topic '{lang ru}Месторасположение{/lang}{lang en}Locate{/lang}'">{lang ru}Местораспол ...</a>            </div>

тут:
{lang ru}Местораспол ...</a>
закрывающий {/lang} обрезан, причем он может быть обрезан
и так:
{lang ru}Местораспол {...</a>
и так
{lang ru}Местораспол {/lang...</a>
18 DES
 
05.06.13
10:06
Поможете?
Как на regex сделать.
Нужно в тексте найти тег {lang xx} ********* {/lang}
Если найден  {lang xx}, но не найден {/lang} и
после {lang xx} найдена подстрока '...' (кавычек нет)
то нужно заменить '...' на '{/lang}...'
19 DES
 
05.06.13
18:55
ладно, скажите тогда как
найти строку в которой есть '{lang '  '...', но между ними нет {/lang}
20 Jaap Vduul
 
05.06.13
19:25
(19)
Тебе нужен negative look-ahead паттерн.
Вот тут по-русски:
http://www.php.net/manual/ru/regexp.reference.assertions.php
21 Fragster
 
гуру
05.06.13
19:29
22 DES
 
05.06.13
19:49
да читать то я умею, я регекс складывать не умею
23 DES
 
06.06.13
12:40
+1
24 badboychik
 
06.06.13
12:45
в регекспах есть метасимвол "конец строки"
25 DES
 
06.06.13
12:54
Есть. Но мне не поможет , т.к. это HTML текст и там может быть ни одного "конца строки"
26 DES
 
06.06.13
12:57
Еще вопрос как найти  подстроку состоящую из подстрок 'abcdegf' любой длины начиная с первого символа + пробел
т.е.
'a '
'ab '
'abc '
...
'abcdegf '
Компьютеры — прекрасное средство для решения проблем, которых до их появления не было.