Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770
Форумы портала PHP.SU :: Версия для печати :: preg_replace замена подстрок в строке
Форумы портала PHP.SU » PHP » Программирование на PHP » preg_replace замена подстрок в строке

Страниц (1): [1]
 

1. broshurkaplus - 13 Февраля, 2011 - 22:36:47 - перейти к сообщению
подставляю смайлы в коменты
есть код ява
CODE (htmlphp):
скопировать код в буфер обмена
  1.  function addsmile($num) {
  2.         window.document.form_com.coment.value=window.document.form_com.coment.value+"[smile]"+ $num+"[/smile] ";
  3.  }
  4. </script>

добавляет коды смайла в текстареа

в таблице ввода комента есть ссылки которые добавляют смайлы
PHP:
скопировать код в буфер обмена
  1. <a href="javascript:addsmile(3);"><img src="smiles/3.gif"></a><a href="javascript:addsmile(4);"><img src="smiles/4.gif"></a><a href="javascript:addsmile(5);"><img src="smiles/5.gif"></a><a href="javascript:addsmile(6);"><img src="smiles/6.gif"></a><a href="javascript:addsmile(7);"><img src="smiles/7.gif"></a><a href="javascript:addsmile(8);"><img src="smiles/8.gif">


при выводе комента обрабатываю
PHP:
скопировать код в буфер обмена
  1. coment=$r_img_coment["coment"];
  2. $coment=preg_replace("/\[smile\](\d+)\[\/smile\]/i",  "<img src='smiles/1.gif'> ",$r_img_coment["coment"]);


и вывожу $coment

подскажите как мне в цикле или в массиве сделать чтобы каждому коду смайла подставлялся соответствующая картинка

если так как показано, то заменяются все, если поочереди и(или) заменяя (\d+) на
(1) (2) и тд
PHP:
скопировать код в буфер обмена
  1. coment=$r_img_coment["coment"];
  2. $coment=preg_replace("/\[smile\](1)\[\/smile\]/i",  "<img src='smiles/1.gif'> ",$r_img_coment["coment"]);
  3. $coment=preg_replace("/\[smile\](2)\[\/smile\]/i",  "<img src='smiles/2.gif'> ",$r_img_coment["coment"]);


то заменяется тока последний , хотя по идее он вродебы должно заменять сначала первое, затем второе и тд

что сделать ?
2. Okula - 13 Февраля, 2011 - 23:02:32 - перейти к сообщению
Заменяй из массива
3. JustUserR - 14 Февраля, 2011 - 13:32:33 - перейти к сообщению
broshurkaplus пишет:
То заменяется тока последний , хотя по идее он вродебы должно заменять сначала первое, затем второе и тд
Что сделать ?
Возможной причиной осуществления некорректной работы предполагаемого PHP-приложения является использование операции замены строковых элементов на основе регулярного выражения с одиночным прохождением поиска - в то время как для обеспечения последовательной замены допустимых вхождений необходимо использование модификатора /g
4. broshurkaplus - 14 Февраля, 2011 - 14:26:10 - перейти к сообщению
те нужно в рег выражении добавить модификатор /g так полагаю в конце? :

"/\[smile\](1)\[\/smile\]/i/g"

попробую вечером.
5. movEAX - 14 Февраля, 2011 - 19:00:39 - перейти к сообщению
Я немного разочарую, но модификатора g в пыхе нет, небыло и скорее всего не будет.

PHP:
скопировать код в буфер обмена
  1. preg_replace_callback('#\[smile\]\s*(\d+)\s*\[/smile\]#i', 'validateSmile', $text);
  2. function validateSmile($match) {
  3.     $id = $match[1];
  4.     return is_file(($img = 'path/' . $id . '.gif'))? $img : '';
  5. }
6. OrmaJever - 14 Февраля, 2011 - 19:11:47 - перейти к сообщению
А зачем делать тег smile? Однако
Вот например в phpbb смайлы в сообщении пишут так
1"%1, 2"%1, 3"%1 и тд.
А затем эту последовательность символов меняем на изображение.

PHP:
скопировать код в буфер обмена
  1. str_replace('1"%1', '<img src="images/smiles/1gif">',$_POST['textarea']);
7. broshurkaplus - 14 Февраля, 2011 - 19:22:34 - перейти к сообщению
с модификатором /g чтото не заработало, я почитал - выдало что он вроде для явы, а у меня это обрабатывается в пхп при просмотре комментариев , которые выводятся в цикле из базы.
Okula пишет:
Заменяй из массива

что то тоже не сработало , хотя я исправил ошибки и вроде всё правильно, может с именами напутал...

сделал так
PHP:
скопировать код в буфер обмена
  1.    $coment=$r_img_coment["coment"];
  2. $coment=preg_replace("/\[smile\](1)\[\/smile\]/i",  "<img src='smiles/1.gif'> ",$coment);
  3. $coment=preg_replace("/\[smile\](2)\[\/smile\]/i",  "<img src='smiles/2.gif'> ",$coment);
  4. $coment=preg_replace("/\[smile\](3)\[\/smile\]/i",  "<img src='smiles/3.gif'> ",$coment);


всё заменило соответствующе везде, я просто не так строку передал, и никто и не указал мне.

теперь думаю как бы мне это в функцию завернуть, чтоб вынести отдельно, а то пример на 3х смалах, а сто если их будет 30... и хоцца чтобы их изначально не было в форме а показывались по ссылке.

подскажете направление мысли?

пака буду пробовать последнее.

 

Powered by ExBB FM 1.0 RC1