За последние 24 часа нас посетили 17849 программистов и 1286 роботов. Сейчас ищут 1442 программиста ...

Помогите с регулярным

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

  1. joost

    joost Guest

    надо узнать есть ли в имено этом тексте текст "mp3"

    <UL><B>Сигналы вызова</B>
    <UL>

    <LI>Полифонические : <FONT class=descr>40-тональные, MP3, MIDI,
    SMAF</FONT>

    <LI><FONT class=descr>Возможность загрузки</FONT>
    <LI><FONT class=descr>Редактор мелодий</FONT> </LI></UL></UL>

    При этом мне не извесно будет там "40-тональные" или "60-тональные", будет ли там текст "MIDI, SMAF". Тоесть этот текст в регулярном надо обозначить как неизвесный

    При этом учесть все лишние пробелы и переходы на новую страницу.
    Я пробовал /<UL><B>Сигналы вызова<\/B>[ \w\\n]+<LI>Полифонические : <FONT class=descr>[ \w]+(.*)[ \w]+<\/font>/isU

    Не идет
     
  2. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    PHP:
    1. <?php
    2.  
    3. // Получу все перечисленные значения
    4.  
    5. $str = file_get_contents ("file.txt");
    6.  
    7. preg_match ("/Полифонические : <FONT class=descr>(.+)<\/FONT>/Usi", $str, $match);
    8.  
    9. $list = explode (",", $match [1]);
    10. $list = array_map ("trim", $list);
    11. $list = array_map ("strtoupper", $list);
    12.  
    13. if (in_array ("MP3", $list)) {
    14.     echo "В списке есть MP3.";
    15. } else {
    16.     echo "Нет нихера. :(";
    17. }
    Тут я записываю все значения в списке "Полифонические", в массив $list (зачем? может понадобится :) ).
     
  3. joost

    joost Guest

    Но при этом выберет не только mp3, а все что есть между <FONT class=descr> и </FONT>
    а мне надо имено текст "мр3".
    Надо также учесть есть ли при єтом текст <UL><B>Сигналы вызова</B> есть ли он. И все єто в одном регулярном. Тоесть как то надо обозначить произвольный текст, неизвесное число пробелов и переходов новой страници или не учесть это при поиске. Об этом я спрашивал в этом посте http://php.ru/forum/viewtopic.php?t=3577
     
  4. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Зачем все в одну регулярку?

    PHP:
    1. <?php
    2.  
    3. $in_1 = (substr_count ($str,  "<UL><B>Сигналы вызова</B>") > 0);
    Хм... сначала надо выдрать че там есть а потом уже с помощью PHP:
    PHP:
    1. <?php
    2.  
    3. preg_match ("/Полифонические : <FONT class=descr>(.+)<\/FONT>/Usi", $str, $match);
    4. $in_2 = (substr_count ($match [1],  "MP3") > 0);
     
  5. joost

    joost Guest

    Кроме этой регулярки есть еще 76 и все это идет в цикле и один раз, поэтому надо в регулярке и в одной.
    Примеры, которые Вы привели конечно покатятно, но на даный момент меня интересует вот такое
    /<UL><B>Сигналы вызова<\/B>[ \w\\n]+#рег1<LI>Полифонические : <FONT class=descr>[ \w]+#рег2(.*)[ \w]+#рег3<\/font>/isUх
    Правильно ли я мыслю
    рег1 - любое количество пробелов, текста, переходов строки (в произвольной последовательности) или ничего (пусто)
    рег2, рег3 - любое количество пробелов, текста (в произвольной последовательности)
     
  6. Vitas

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

    С нами с:
    7 фев 2006
    Сообщения:
    595
    Симпатии:
    0
    Адрес:
    Новосибирск, Академгородок
    Надоело...

    PHP:
    1. <?php
    2.  
    3. if (preg_match ("/<UL><B>Сигналы вызова<\/B>.*<LI>Полифонические : <FONT class=descr>.*MP3.*<\/font>/isU", $str, $match)) {
    4.  
    5.     echo "Совпадение";
    6.  
    7. } else {
    8.  
    9.     echo "Не совпадение.";
    10.  
    11. }
     
  7. joost

    joost Guest

    Спасиб! и на том!
     
  8. mclaud

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

    С нами с:
    15 фев 2007
    Сообщения:
    97
    Симпатии:
    0
    Адрес:
    Одесса
    Мне кажется лучше так:
    PHP:
    1.  
    2. if (preg_match_all ("/\<UL\>\<B\>Сигналы вызова\<\/B\>\s*([^\<])+\<LI\>Полифонические : <FONT class=descr>([^\.])+MP3[^\<]*\<\/font\>/isU", $str, $match)>1)
    3. {
    4. print('<pre>');
    5. print_r($match);
    6. print('</pre>');
    7. } else {
    8.     echo "Ничего не надено!";
    9. }
     
  9. Murena

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

    С нами с:
    15 июл 2006
    Сообщения:
    20
    Симпатии:
    0
    Дабы не создавать темы вопрос тут.
    Подскажите, пожалуйста, регулярку которая бы заменяла только знак ";", но, например, не портила бы & #59;

    PHP:
    1.  
    2. <?php
    3.  
    4. $t = preg_replace("/(?<!&#[0-9]+);/s", ';', $t );
    5.  
    - это не работает, в чем ошибка?

    PS и еще мелочный вопросец. :) Какую роль играет & вот в такой строке из ipb? Наследование? :/

    PHP:
    1.  
    2. <?php
    3.  
    4. $ipsclass->print->ipsclass  =& $ipsclass;
    5.  
     
  10. Anonymous

    Anonymous Guest

    Передача по ссылке.
     
  11. simpson

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

    С нами с:
    11 фев 2006
    Сообщения:
    1.650
    Симпатии:
    0
    Адрес:
    Санкт-Петербург
    &#[0-9]+ - нефиксированная длина.
     
  12. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Murena
    а что значит 'заменяла только знак ";"'? на что заменяла? можно пример с тем, что и на что вы хотите заменить и что вы заменять не хотите?

    по поводу передачи по ссылке и вообще работы пхп с памятью -- очень рекомендую следующую статейку. многое объясняет :
    http://derickrethans.nl/files/phparch-p ... rticle.pdf
     
  13. Luge

    Luge Старожил

    С нами с:
    2 фев 2007
    Сообщения:
    4.680
    Симпатии:
    1
    Адрес:
    Минск
    stas_t, Вы бы ещё на прошлогодние посты отвечали ;)
     
  14. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Luge
    не вопрос, доберёмся и до прошлогодних. было бы желание :)
     
  15. Murena

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

    С нами с:
    15 июл 2006
    Сообщения:
    20
    Симпатии:
    0
    stas_t
    Поддержим :)
    Заменяла на html эквивалент. Если проще то задача состоит в том, чтобы все "&#здесь_число;" не трогать. А "&" "#" ";" заменять.
     
  16. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    >>>"&#здесь_число;" не трогать. А "&" "#" ";" заменять

    PHP:
    1.  
    2. <?
    3. $_POST['key_name'] = preg_replace('/[\D]+/','',$_POST['key_name']);
    4. ?>
    5.  
     
  17. Murena

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

    С нами с:
    15 июл 2006
    Сообщения:
    20
    Симпатии:
    0
    Не совсем то.. Если вот такая конструкция "&#здесь_число;" то символы "&" "#" ";" не заменяем.

    Вот, хотя бы так сделать, заменяя только ";"

    ДО
    HTML:
    1.  
    2. ; ' &#39 ;
    3.  
    ПОСЛЕ
    HTML:
    1.  
    2. ; ' &#39 ;
    3.  
     
  18. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    аа..

    PHP:
    1.  
    2. <?
    3. $POST['key_name'] = preg_replace('/&#[0-9]{2};/',' ',trim($POST['key_name']));
    4. ?>
    5.  
     
  19. Murena

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

    С нами с:
    15 июл 2006
    Сообщения:
    20
    Симпатии:
    0
    DarkElf
    Спасибо за помощь. В выражении {2} значит символьная длина цифр? Если да, то html эквивалент ";" можно записать как

    HTML:
    1. ";" и ";"
    в таком случае вот это выражение верно?

    PHP:
    1. <?
    2.    $POST['key_name'] = preg_replace('/&#[0-9]{2,3};/',' ',trim($POST['key_name']));
    3. ?>
     
  20. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    ; -- не спецсимвол в html, эквивалент точки с запятой есть только точка с запятой. то же самое касается знака диез. согласно стандарту только & должен записываться как &amp; (и цифры тут вообще ни причём, т.к. в разных кодировках у знаков могут быть разные позиции)
     
  21. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    да, верно.. там есть амперсанд, решетка и последовательность из 2 или 3 цифр.
     
  22. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    только единственно, регулярка именно эти символы и заменит=)
     
  23. DarkElf

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

    С нами с:
    22 окт 2006
    Сообщения:
    1.632
    Симпатии:
    0
    /[^&#][^0-9]{2,3};/
     
  24. Murena

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

    С нами с:
    15 июл 2006
    Сообщения:
    20
    Симпатии:
    0
    stas_t
    Не для китайцев пишем, поэтому с windows-1251 и utf-8 всё ок.

    DarkElf
    Респект! :)
     
  25. stas_t

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

    С нами с:
    24 апр 2007
    Сообщения:
    500
    Симпатии:
    0
    Адрес:
    Courbevoie, France
    Murena
    поэтому ; и # экранировать не нужно