[Регулярки & Mod_Rewrite] Задай вопрос, получи ответ.

Discussion in 'PHP' started by .:EnoT:., 19 Nov 2008.

Thread Status:
Not open for further replies.
  1. mff

    mff Elder - Старейшина

    Joined:
    12 Mar 2008
    Messages:
    2,074
    Likes Received:
    701
    Reputations:
    227
    Вот так написал ^[а-я][А-Я]* и теперь в поле Имя Фамилия нельзя записать адрес сайта...
     
  2. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    if (preg_match('/\\b(http:\/\/|)([-A-Z0-9.]+)(\/[-A-Z0-9+&@#\/%=~_|!:,.;]*)?(\\?[-A-Z0-9+&@#\/%=~_|!:,.;]*)?/i', $subject, $res)) условие, если да;
    else условие, если нет;
     
  3. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    я понимаю, просто я говорю, что будет если ту строчку вставить в то поле(как мне кажется)
     
  4. Ru}{eeZ

    Ru}{eeZ Elder - Старейшина

    Joined:
    19 Feb 2008
    Messages:
    454
    Likes Received:
    73
    Reputations:
    -5
    Переменная (массив) в регулярке

    Переменная (массив) в регулярке.
    preg_match('/^[^ ^($badNames)].{1,12}$/', $_POST['nameUser']);

    регулярки вообще бегают по массивам?
    как правильно сделать, чтобы регуляркой проверялись на исключение все значения массива.
    Массив типа:
    PHP:
    $badNames = array(
    'Admin',
    'Administrator'
    );
     
  5. ntldr

    ntldr Elder - Старейшина

    Joined:
    4 Dec 2007
    Messages:
    367
    Likes Received:
    140
    Reputations:
    23
    бегают, если им дать пинка
    PHP:
    foreach ($badNames as $item)
    {
    preg_match('/^[^ ^($item)].{1,12}$/'$_POST['nameUser']);
    }
     
    1 person likes this.
  6. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Ru}{eeZ А что вы собственно собрались этими регулярками делать оО. Если проверять, что вводимый логин не начинается со слов в массиве, то лучше использовать strpos

    PHP:
     $badNames = array(
    ' ',
    'Admin',
    'Administrator'
    ); //Включая пробел

    foreach($badNames as $nam) if (stripos($_POST['nameUser'],$nam)===0) die('Неправильное имя');// ===0 чтобы остановиться, только если запрещенное слово в начале строки. 
     
    _________________________
    #86 Gifts, 16 Dec 2008
    Last edited: 16 Dec 2008
  7. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Помогите с рекурсивной регуляркой. Есть входной текст:
    Code:
    <div class="a1">
    	<div class="b1">
    		<div class="c1">
    			sometext1
    		</div>
    		<div class="c2">
    			sometext2
    		</div>
    	</div>
    </div>
    <div class="a1">
    	<div class="b1">
    		<div class="c1">
    			sometext3
    		</div>
    		<div class="c2">
    			sometext4
    		</div>
    	</div>
    </div>
    Нужно получить все, что находится между <div class="a1"> и соответствующим ему </div>. Причем, для любого количества вложенных дивов
     
    _________________________
  8. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Ну если тебе нужно выдернуть только sometext№№, то тогда можно так:

    PHP:
    <?
    preg_match_all('|<div(.*)class(.*)>(.*)</div>|Ui'$s$result);
    print_r ($result);
    ?>
    Данные будут в $result[0][0] $result[0][1] $result[0][2] $result[0][3]
     
  9. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Pashkela Во-первых, точка НЕ учитывает перевод строки без модификатора "s". Во вторых при вложенных, одинаковых тэгах результатом будем получать кривые данные, типа:
    Code:
    <div class="b1">
    		<div class="c1">
    			sometext3
    
    И в третьих - зачем использовать подмаски, там где это мягко говоря не нужно?
     
    _________________________
  10. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Во первых всё работает. Это раз. Во вторых (правда не знал, что ты не знаешь таких эелементарных вещей) - если ты проверяешь на исходном тексте в .txt файле, то всё должно быть написано в одну строчку. Никаких <br> я там не увидел.

    ЗЫЖ Если все сохранить в .txt в одну строку и запустить мою регулярку - всё прекрасно работает
     
  11. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    PHP:
    <?php 
    $in
    =
    '<div class="a1">
        <div class="b1">
            <div class="c1">
                sometext1
            </div>
            <div class="c2">
                sometext2
            </div>
        </div>
    </div>
    <div class="a1">
        <div class="b1">
            <div class="c1">
                sometext3
            </div>
            <div class="c2">
                sometext4
            </div>
        </div>
    </div>'
    ;

    if (
    preg_match_all('|<div(.*)class(.*)>(.*)</div>|Ui'$in$result))
    print_r ($result); else echo 'Нету такого'
    результат без модификатора s:
    Code:
    Нету такого
    Результат C модификтором s:
    Code:
    Array
    (
        [0] => Array
            (
                [0] => <div class="a1">
    	<div class="b1">
    		<div class="c1">
    			sometext1
    		</div>
                [1] => <div class="c2">
    			sometext2
    		</div>
                [2] => <div class="a1">
    
    	<div class="b1">
    		<div class="c1">
    			sometext3
    		</div>
                [3] => <div class="c2">
    			sometext4
    		</div>
            )
    
        [1] => Array
            (
                [0] =>  
                [1] =>  
                [2] =>  
                [3] =>  
            )
    
        [2] => Array
            (
                [0] => ="a1"
                [1] => ="c2"
                [2] => ="a1"
                [3] => ="c2"
            )
    
        [3] => Array
            (
                [0] => 
    	<div class="b1">
    		<div class="c1">
    
    			sometext1
    		
                [1] => 
    			sometext2
    		
                [2] => 
    	<div class="b1">
    		<div class="c1">
    			sometext3
    		
                [3] => 
    			sometext4
    		
            )
    
    )
    
    Вопросы?
     
    _________________________
    #91 Gifts, 17 Dec 2008
    Last edited: 17 Dec 2008
    1 person likes this.
  12. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    Нет, ну молодец конечно, просто это не надо в случае парсинга реальной html-страницы
     
  13. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Реальная html страница:
    PHP:
    <?PHP $in="<html>\r\n<body>Надеюсь это не откровение, что в ХТМЛ можно вставлять переводы строк? Хоть они и не будут показаны в браузере, однако в исходном коде будут пристутствовать \r\n</body>\r\n</html>";
    echo 
    $in;
    Вопрос актуален - подскажите рекурсивную регулярку для любого количества вложеных дивов
     
    _________________________
  14. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    В качестве доказательсва моей правоты - парсер зе беста с Баша, без всяких там "s"
    PHP:
    <?
    $filename file_get_contents('http://bash.org.ru/best'); 
    $patern '|<div>(.*)</div>|Ui';
    preg_match_all($patern$filename$result);
    print_r ($result);
    ?>
    В исходниках сплошные красные абзацы:))) Учим html и не тупим:) Peace
     
  15. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Pashkela
    PHP:
    $patern '|<body(.*)</body>|Ui';
    Проверь, как же так, бедааа, тэг <body есть, закрывающий </body> есть, а ничего не выводит.. Бедаааа. А то что в дивах самих цитат нет переводов строк, как бы логично. Данные берутся из БД и следить за опрятностью кода - не нужно

    Ну давай расскажи мне что я не прав)
     
    _________________________
  16. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    лучше выложу тебе код на твой конкретный случай, раз тебе так надо:)

    PHP:
    <?
    $in
    '<div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext1 
            </div> 
            <div class="c2"> 
                sometext2 
            </div> 
        </div> 
    </div> 
    <div class="a1"> 
        <div class="b1"> 
            <div class="c1"> 
                sometext3 
            </div> 
            <div class="c2"> 
                sometext4 
            </div> 
        </div> 
    </div>'
    ;


    if (
    preg_match_all('/<div class="a1">(.*)<\/div>/s'$in$result)) 
    echo 
    'Оле!'"\r\n"; else echo 'Нету такого';
    $t explode("\r\n"$result[0][0]);
    $count count($t);
    for (
    $i=0;$i<$count;$i++) 
    {
    if (!empty(
    $t[$i])) {echo $t[$i];}
    }
    ?>
     
    #96 Pashkela, 17 Dec 2008
    Last edited: 17 Dec 2008
  17. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    $patern = '|<body(.*)</body>|Ui';

    потому что закрыть забыл первый тег ">"

    правильно так:

    $patern = '|<body>(.*)</body>|Ui';
     
  18. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Pashkela Не пиши по моему вопросу ничего плиз. Вы опасны для моего мозга

    Эт имба код - прогнать через жадную регулярку, и вывести код построчно, я бы так не сумел

    Афигеть, зайди на этот баш, открой исходный код страницы и посмотри что начальный тэг тела документа выглядит: <body style="margin: 0px;"> Поэтому тэг СПЕЦИАЛЬНО не закрыт
     
    _________________________
  19. Pashkela

    Pashkela Динозавр

    Joined:
    10 Jan 2008
    Messages:
    2,750
    Likes Received:
    1,044
    Reputations:
    339
    "Эт имба код - прогнать через жадную регулярку, и вывести код построчно, я бы так не сумел"

    Зато рабочий

    "Вы опасны для моего мозга"

    Конечно, неприятно осознавать, когда тебе знаниями по мозгам надавали:) Выкладывай хоть какую-то свою рабочую не " имба" версию, ламота:)))

    ЗЫЖ Развелось псевдо-спецов. Лично тебе помогать больше не буду, если ты так просишь. Ему рабочий код дали - а оно тут пузыри пускает сидит. Ппц. Извините, простите, что выложил вас вероятно не самое оптимальное решение вашей проблемы. Больше не повторится

    "Афигеть, зайди на этот баш"

    Молодой человек, если вы ничего не понимаете в регулярках, то лучше не выё, в тот момент мне конкретно на баш уже было пох. А ваш вариант -

    $patern = '|<body(.*)</body>|Ui';

    полный бред:)
     
  20. Gifts

    Gifts Green member

    Joined:
    25 Apr 2008
    Messages:
    2,494
    Likes Received:
    807
    Reputations:
    614
    Постараюсь все-таки объяснить, что Вы биплан (самолет такой убогий)

    Начнем - в быдлокоде, что Вы предложили последним. С помощью жадной регулярки получаете массив. Элемент $result[0][0] содержащий ВСЮ переменную $in. (Если у вас вдруг установлен PHP можете это проверить) Дальше вы разбиваете этот массив и выводите все не пустые строки. Но ояебу, можно было бы написать echo $in; результат был бы тот же.

    Заметьте, я объяснил в чем вы не правы, и насколько вы не правы. При этом я не свел все это рассуждение, как вы - "моя твоя труба качал".

    Прежде чем что-то, кому-то советовать, проверяйте все таки это у себя.
     
    _________________________
Thread Status:
Not open for further replies.