За последние 24 часа нас посетили 18112 программистов и 1624 робота. Сейчас ищут 1287 программистов ...

Число 0 - 200

Тема в разделе "Регулярные выражения", создана пользователем Freakmeister, 13 авг 2012.

  1. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Есть регулярка, которая парсит бб-код размера текста, заданного в процентах. Как задать максимальный размер шрифта в 200%?

    Код (PHP):
    1.     $bbcode = array(
    2.         "'\[size=(.*?)\](.*?)\[/size\]'is" => "<span style='font-size: \\1%;'>\\2</span>"
    3.         );
    4.         $text = preg_replace(array_keys($bbcode), array_values($bbcode), $text); 
     
  2. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    Код (Text):
    1. <?php
    2.     function mf($txt){
    3.         $patt = '/^(1?\d{1,2}|200)$/';
    4.         $match = array();
    5.         preg_match($patt, $txt, $match);
    6.         print $txt;
    7.         print_r($match);
    8.     }
    9.     mf(1);
    10.     mf(22);
    11.     mf(123);
    12.     mf(200);
    13.     mf(1234);
    14. ?>
     
  3. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Нет, ты не понял вопроса. Как мне такую проверку добавить в приведённое в первом посте выражение? Вот у меня там первый (.*?) - надо чтобы он проверялся на число от 0 до 200.
     
  4. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    эт врядли, я тебе кидаю идею, хочешь - немного подумай, и встрой ее в свою регулярку
     
  5. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Твой вариант пашет, ну, что - то это какие - то грабли.


    Это тоже пашет.


    Код (PHP):
    1. function size($size,$value) {
    2.     return'<span style="font-size:'.(($size>200)?200:$size).'%;">
    3.             '.$size.'
    4.         </span>';
    5. }
    6.  
    7. $text='[size=200]111111[/size]';
    8. $text=preg_replace('#\[size=(\d+)](.+?)\[/size]#ies','size(\'\\1\',\'\\2\')',$text);
    9. echo $text; 
     
  6. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Можно немного улучшить идейку, добавив возможность ведущих нулей, типа:
    Код (Text):
    1. ([0]*(?:[0,1]?\d{1,2}|200))
     
  7. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Да ему не это нужно, еще раз читайте...
     
  8. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ну объясните мне, бестолковому, что ему нужно? (попроще)
     
  9. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7

    А ты выше пост мой посмотри...
     
  10. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Ещё раз: объясни (попроще), - что ему нужно?
     
  11. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7

    Просто он так выразился, не совсем корректно.


    И у него preg_replace.

    А не то, что вы preg_match ему тулите.
     
  12. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    А теперь объясни, как (1?\d{1,2}|200) и ([0]*(?:[0,1]?\d{1,2}|200)) НЕрешает задачу "проверялся на число от 0 до 200".
    Т.е. объясни своё "Да ему не это нужно"...
     
  13. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    ну ты полностью напиши и покажи, где ты решил это?
     
  14. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    И как будет правильно? (в твоей интерпретации)
    А попытать не пробовал ;) Попытай, - потом расскажешь, каким боком тут preg_match :)

    Добавлено спустя 1 минуту 2 секунды:
    Не я решил - Крыс. Я только развил его идею по поводу ведущих нулей.
     
  15. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Chushkin, напиши полностью, чтобы видеть как ты решишь парсинг с preg_match и его preg_replace.
     
  16. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    :)))
    п.с. Да, я уже понял, что ты не хочешь признавать свою ошибку. Удачи.

    Добавлено спустя 4 минуты 57 секунд:
    Крыс уже написал что делать: подставить вместо (.*?) указанный кусок регулярки.
    Вот подставь и поиграйся с цифрами от 0 до 200 и больше и посмотри что получится. Потом расскажешь что.
     
  17. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Что? Ошибку!?)

    Где там ошибка?
     
  18. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Утверждение "Да ему не это нужно".
     
  19. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ты накурился!?)

    Смотри теперь:

    Код (PHP):
    1. function size($size,$value) {
    2.     return'<span style="font-size:'.(($size>200)?200:$size).'%;">
    3.             '.$value.'
    4.         </span>';
    5. } 
    Код (PHP):
    1. $text='[size=2000000000000]111111[/size]';
    2. $text=preg_replace('#\[size=([0]*(?:[0,1]?\d{1,2}|200))](.+?)\[/size]#ies','size(\'\\1\',\'\\2\')',$text);
    3. echo $text; //[size=2000000000000]111111[/size] c 200 норм, без б, с Крысавым будет также  
    Код (PHP):
    1. $text='[size=2000000000000]111111[/size]';
    2. $text=preg_replace('#\[size=(\d+)](.+?)\[/size]#ies','size(\'\\1\',\'\\2\')',$text);
    3. echo $text; // 200 c size 200%      

    Не советую пользоваться загруженными шаблонами, это " - " в производительности.
     
  20. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    Это твоя персональная интерпретация озвученной ТС задачи.
    По моему мнению (и, думаю, Крыс-а) твоё решение неправильное. Правильным оно будет, если ТС соответственно изменит условие задачи.
     
  21. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Да, что ты только говоришь, и говоришь...

    Возьми и напиши, как будет правильно или только дар речи есть?

    Полностью напиши, мне как ты считаешь по данной задачи, сделать, код выложи.

    А потом уже поговорим.
     
  22. Chushkin

    Chushkin Активный пользователь

    С нами с:
    17 дек 2010
    Сообщения:
    1.062
    Симпатии:
    91
    Адрес:
    Мещёра, Центр, Болото N3
    (R) Крыс уже написал что делать: подставить вместо (.*?) указанный кусок регулярки.
    Хм...
    А вообще, спор бестолковый - у нас просто разная интерпретация/понимание задачи. Я понимаю "как есть", ты понимаешь "как должно быть" (по твоему мнению). На этом и закончим, ибо спор получается про интерпретацию. Бум считать - ничья, все правы. :)
    п.с.
    Кстати, модификатор "e" надо использовать очень осторожно, - дыра в безопасности.
     
  23. Крыс

    Крыс Активный пользователь

    С нами с:
    3 фев 2012
    Сообщения:
    449
    Симпатии:
    0
    присоединяюсь :)

    да, была мысль про это..но чет захотелось на это забить :)
    и да, прег_матч там был для иллюстрации работы регулярки.
     
  24. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Ой да пишите, кто вам мешает.
     
  25. Freakmeister

    Freakmeister Активный пользователь

    С нами с:
    20 дек 2009
    Сообщения:
    888
    Симпатии:
    5
    Ололо.) Chushkin прав, мне нужно было именно это:
    "'\[size=(1?\d{1,2}|200)\](.*?)\[/size\]'is" => "<span style='font-size: \\1%;'>\\2</span>"

    Просто я не шарю в регулярках и не сразу понял куда чего подставлять. У меня теперь возник другой вопрос - вот например, юзер написал в сообщении: text. Соответственно, этот текст не пропарсится и при выводе останется в неизменённом виде. А реально ли изменить регулярку в первом посте так, чтобы если размер задан больше 200, то оно его насильно уменьшало до 200? В phpBB такая проверка делается при отправки текста пользователем, а я хочу сделать чтобы пользователь мог отправить всё что угодно, а проверка происходила уже при выводе текста.