Регулярный выражения

N3K

Новичок
Регулярный выражения

Есть строка:
{ARTIST} - {ALBUM}
Надо из неё вытащить
значения, находящиеся в скобках {}
Использую выражение:
preg_match('/({[^{]+?})/U',$str,$ar);
Результат:
Array
(
[0] => {ARTIST}
[1] => {ARTIST}
)

Подскжаите что я тут не правельно делаю ? Заранее благодарен.
 

Zetruger

ivan.chistyakov.name
preg_match('/({[^{]+?})/U',$str,$ar);

^{ - это ошибка или нет?
скорее всего здесь нужно ^}

~{([^}]+)}~

если так то модификатор U не имеет смысла


ну и конечноже
preg_match_all


или изврат с preg_match в цикле while
+ колдавство с offset ))


AmdY
Mr.M.I.T.
ваши посты очень информативны ))
 

N3K

Новичок
С preg_match_all выражение /({[^{]+?})/U работает коректно. Разбивает строку
Artist: {ARTIST}, album: {ALBUM}..
на масив
Array
(
[0] => {ARTIST}
[1] => {ALBUM}
)

>> зачем вам это надо?
Делаю музыкальный портал. Изменение титла и мета ключа.
 

Mr.M.I.T.

Новичок
>>Делаю музыкальный портал. Изменение титла и мета ключа.
*с осторожностью
а зачем вам их выбирать из текста?
вам точно их не заменять нужно?
 

N3K

Новичок
Есть шаблон, для каждой страницы, который устанавливает администратор сайта. Я получаю все элементы в скобках, потом использую их как индекс для поиска элементов замены.

-~{}~ 06.11.08 18:23:

Автор оригинала: N3K
Есть шаблон, для каждой страницы, который устанавливает администратор сайта и элемены замены, которые так же можно добавлять\удалять. Я получаю все элементы в скобках, потом использую их как индекс для поиска элементов замены.
 

dimagolov

Новичок
N3K, а зачем два раза делать поиск по шаблону? не логичнее искать все элементы, для которых есть замены и сразу их менять?
 

N3K

Новичок
В начале нужно найти поля, которые надо заменять. В примере выше находится 2 лемента для замены (ARTIST,ALBUM) , но их множество, просто в данном шаблоне используется два.
 

dimagolov

Новичок
тебе ничего не мешает искать поля и сразу заменять те, что нашлись
 

Mr.M.I.T.

Новичок
вообщем думаю этот пример вам поможет
PHP:
<?
$vars=array("{ARTIST}","{ALBUM}");
$replace=array("Артист","Альбом");
$text="Artist: {ARTIST}, album: {ALBUM}..";
print str_replace($vars,$replace,$text);
?>
 

dimagolov

Новичок
Mr.M.I.T., ты не понял. список замен много шире, и искать все возможные поля не имеет смысла.

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

Иван 76

Новичок
N3K,
Многие программисты на каком-то этапе своего пути делают собственные шаблонизаторы.
Вначале в ход идут строковые функции.
Потом этого становится мало. Нужны циклы. Потом нужны вложенные циклы.
Строковых функций становится мало.
Кроме того, возникает вопрос безопасности при многоступенчатой обработки шаблона строковыми функциями. Ведь пользователь может ввести в текстовое поле символы "{ARTIST}", и они могут быть обработаны.
В результате возникает необходимость в создании парсера.
Даже известный шаблонизатор Smarty осознал ограниченность использования строковых функций для шаблонизатора, и с версии 3.* используется уже парсер.
http://smarty-php.googlecode.com/svn/branches/Smarty3Alpha/README
Smarty 3 now uses a real lexing tokenizer. This opens all kinds of doors
such as template math, function recursion, among many other things.
Позже может возникнуть вопрос переносимости шаблонов с одного языка программирования на другой (например, разные части одного приложения работают и на PHP, и на Python).

Возникает вопрос об использовании общепринятого языка разметки - xml, xslt.

В ход идут такие библиотеки как
http://sourceforge.net/projects/webtemplate

Для удобства дизайнеров, упрощения верстки, в ход начинают идти такие шаблонизаторы как
http://phptal.motion-twin.com/
или
http://phpoot.sourceforge.jp/zogan/

Потом начинаются религиозные войны на почве того, какой шаблонизатор лучше.

А люди, которые все это уже перепробовали, начинают понимать, что возможно, фраза из мануала к Zend Framework имеет под собой здравый смысл:
...PHP сам по себе представляет собой мощный шаблонизатор...
Вывод: прежде чем начать создавать новый шаблонизатор, стоит подумать, а нужен ли он вообще, и, если нужен, - может быть присмотреться к существующим решениям?
 

Maxsystems

Новичок
Новый вопрос в тему нужно обработать текст, например:

Привет товарищи, [link]data|200|1|0|2|здесь|[/link] лежит интересная информация. Для открытия вам нужно, нажать на слово здесь, слово здесь являеться сылкой, если вы не умете пользоваться сылками то что бы научиться нужен компьютер мышь и ...

Нужны выбрать слово между [link][/link] - записать в переменную напримет $text , после чего идет скрипт создает нужные текст и заменяет всю строку [link]data|200|1|0|2|здесь|[/link] на новые данные - $newtext='hello я новый текст', как это сделать?
 

Maxsystems

Новичок
http://ru2.php.net/preg_replace_callback
Прочитал этот монуал, ничего не понял, чето там не то написано..

preg_replace_callback - она заменяет только по функции или можно вызвать класс?

Меня в тупик поставило это:
PHP:
preg_replace_callback(
              "|(\d{2}/\d{2}/)(\d{4})|",
              "next_year", // <- Здесь
              $text);
Почему next_year заданна как строковая, а чуть выше есть функция next_year(); Вообщем совпадение с название функции и вывод результата можно сделать умозаключение, что там обрабатывается чере функцию. Вопрос а почему вместо "next_year" next_year или $zamena->next_year()
????

-~{}~ 07.11.08 12:35:

Как будет выглядить регулярное выражение для этого случая?
[link]текст|[/link]
 

Иван 76

Новичок
>preg_replace_callback - она заменяет только по функции или можно вызвать класс?
Чтобы вызвать класс, используй в качестве аргумента callback массив с указанием класса и метода, например array($this, 'some_method').
Или делай вызов статического метода.
 

N3K

Новичок
Иван 76
Спасибо за глубокое описание )))) В данном случае мощьный шаблонизатор не нужен, т.к. шаблоны и элемены замены будут забиваться администратором а не пользователями.
п.с. проект как раз на зенде :)
 
Сверху