Эта тема на forum.dklab.ru


Глюк: RegEx или разбор строки...
У меня возникла огромная проблема. Вот у меня есть строка <? $st="1234567, Hello World {dop}; ?>
У меня есть некая база, содержащая в себе ассоциативный массив. Т.е <? baza_slov = array ('dop'=>'<b>');?>
Я в строке ищу ключи и заменяю их значениями этого массива. Т.е. foreach($basa_slov as $key=>$value)
{
$normal_text=str_replace('{'.$key.'}', $value,$st);
}
У меня в итоге $normal_text = "1234567, Hello World <b>";
Но как сделать если у меня этот {dop} имеет параметр {dop align="rignt"}. Мне нужно чтобы в базе числился один тег с параметром, но параметр имел динамическое значение. Т.Е если написано {dop align="rignt"} он мне заменял на <b align="right">

P.S: Извиняюсь за неизв. тег <b align="rignt">, просто мне было лень переписывать...
Заранее благодарен!
Дмитрий Эсс:
Перенесено из форума: Программирование::PHP::Склад готовых решений.
Перенесено в форум: Программирование::PHP::Все в кучу.
Дмитрий Эсс:
Глюк:
Это регами делается. Вы хотите в массиве хранить именно полноценные теги с угловыми скобками, например, "<b>", или можно просто "b"?
Глюк:
Приведите простой пример пожалуйста. Можно так или нет : {dop align="[:alnum:]"} => <b align = "[:alnum:]"> ?
Заранее благодарен!
Дмитрий Эсс:
Конкретно для Вашего случая это будет выглядеть примерно так:
$normal_text = eregi_replace("{".$key."([^}]*)}", substr($value, 0, -1)."\\1".substr($value, -1, 1), $st);
Дмитрий Эсс:
Глюк:
Т.е. аттрибуты у тега заранее предопределены? Может быть только align?
Глюк:
Извините, меня - ламера. А не могли бы вы пояснить, всё выше написанное? Да, и что делает функция substr?
Заранее благодарен!
Глюк:
У тега? У dop? Да у него я например знаю align и border... Вобщем мне нужно универсальная функция, потаму что в тегов много.
Заранее благодарен!
Дмитрий Эсс:
php.net/substr
Этот код делает сдедующиее. Ищет подстроку {dop_что_угодно_} и заменяет её на <b_что_угодно_>. С помощью функции substr() мы "раздвигаем" конечный символ ">" в $value и оставшуюся часть строки, чтобы вставить туда _что_угодно_.
Глюк:
Ну а если нам нужно {dop src="1.gif"} переделать в <img src="1.gif">!!!
Заранее благодарен!
Дмитрий Эсс:
Глюк:
Разберитесь сначала до конца в коде. Просто измените массив $baza_slov.
$baza_slov = array ('dop'=>'<img>');
Дмитрий Эсс:
А если в массиве хранить теги без угловых скобок (например, array ('dop' => 'img')), то всё будет ещё проще.
$normal_text = eregi_replace("{".$key."([^}]*)}", "<".$value."\\1>", $st);
Глюк:
А что значит \\1. Почему не просто 1???
Глюк:
Попробовал вот такой простой пример
<?
$st="234567890{dop align=center}";
$key="dop";
$value = "<b>";
$normal_text = eregi_replace("{".$key."([^}]*)}", substr($value, 0, -1)."\\1".substr($value, -1, 1), $st);
echo "Значение $normal_text";
?>
И не работет!!!!
Дмитрий Котеров:
Попробуйте вместо

"{".$key."([^}]*)}"

так:

"\\{".$key."([^}]*)\\}"

WingedFox:
Гм...

htmlspecialchars($normal_text);

Глюк:
О! Свершилось! Работает!
Спасибо всем! Только я не понял причем тут
Гм...
Код (php):
htmlspecialchars($normal_text);
Глюк:
Всё было бы хорошо, но не подскажите почему ЭТО не работает????
<?
echo "Уже работет!";
function coding($base_of_tags, $st) {
foreach($base_of_tags as $key=>$value)
{
$normal_text = eregi_replace("\\{".$key."([^}]*)\\}", substr($value, 0, -1)."\\1".substr($value, -1, 1), $st);
}
return $normal_text;
}
$base = array("dop"=>"<b>");
$text = "1233454567778, hello world! {dop align=center}dgdfgdg";
$NewFile=fopen("text.txt",'a');
normal_text=coding($base, $text);
fwrite($NewFile,$normal_text.chr(13).chr(10));
fclose($NewFile);
echo "РАБОТАЕТ!";
?>
Anonymous:
Да, заранее благодарен!
7.3.:
Вобщем мне нужно универсальная функция, потаму что в тегов много.
Ну а если нам нужно {dop src="1.gif"} переделать в <img src="1.gif">!!!
А не легче просто заменять типа:

$tags = array ("dop" => "img");
$text = "1233454567778, hello world! {dop src="1.gif" align=center}dgdfgdg";
foreach($tags as $mytag => $htmltag) {
$text = ereg_replace("\\{".$mytag."[[:blank:]]+([^}])*\\}","<".$htmltag." \\1>",$text);
}

Как работает не пробовал, но думаю мысль ясна.
Дмитрий Эсс:
7.3.:
1. Учёт регистра тут не к чему.
2. Аргументы могут отсутствовать.
3. См. моё последнее сообщение =).

Глюк:
Извеняюсь, забыл, что {} - спец. символы.
По поводу неработающего кода.
$normal_text=coding($base, $text);
Читайте текст ошибки.
Дмитрий Эсс:
Глюк:
Кстати, почему Вы упорно не хотите в массиве писать просто "img" вместо "<img>"? Это сильно упрощает код.
Глюк:
Да, я с вами согласен. Действительно без <,> лучше! И понятнее и работы меньше!
Глюк:
А можно ли параметры менять? Т.е параметр polozenie на align.
Дмитрий Эсс:
Глюк:
А попробовать слабО? Ещё советую про реги почитать.
Дмитрий Эсс:
Если так пойдёт дальше, то я закрою тему.

Эта тема на forum.dklab.ru