За последние 24 часа нас посетил 30871 программист и 1444 робота. Сейчас ищут 819 программистов ...

Регулярное выражение не работает

Тема в разделе "PHP для новичков", создана пользователем Priler, 10 мар 2013.

  1. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Здравствуйте
    Мне надо с помощью регулярных выражений найти все теги strong на странице в которых есть слово Привет.
    Так вот, шаблон такой |<strong(.*)> *?Привет *?</strong>|i

    В случае если html код в котором он ищет такой:
    Код (Text):
    1.  
    2. <strong>Привет</strong>
    То он находит

    Если html код такой:
    Код (Text):
    1.  
    2. <strong>
    3. Привет
    4. </strong>
    Он не находит.
    Пробовал делать так: |<strong(.*)> *?Привет *?</strong>|iUs

    Но все равно не работает.
    Помогите решить проблему пожалуйста.
    Заранее спасибо!
     
  2. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    Код (PHP):
    1. $str='<strong>
    2. Привет
    3. </strong>
    4. <strong>Привет</strong>';
    5. preg_match_all('/<strong>Привет<\/strong>/',preg_replace('/[\n\s]/','',$str),$matches);
    6. var_dump($matches); 
     
  3. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а флаг m религия не позволяет использовать?
     
  4. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal делал я M все равно не работает

    Добавлено спустя 5 минут 38 секунд:
    Your делаю поиск в html коде по как ты сказал:
    Код (Text):
    1.  
    2. preg_match_all($sregular,preg_replace('/[\n\s]/','',strtolower_my($html)),$matches);
    3. var_dump($matches);
    Где $sregular равно |прив(.*) *?дру(.*) *?мо(.*) *?<\/strong>|i
    Мне надо находить именно такую комбинацию слов прив(.*) *?дру(.*) *?мо(.*) *? в большом HTML коде
    Не находит...
     
  5. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Код (PHP):
    1. <?php
    2. $str='<strong>
    3. Привет
    4. </strong>
    5. <strong>НеПривет</strong>';
    6. preg_match_all('#<strong>.*</strong>#iUms', $str, $matches);
    7. var_dump($matches); 
    8. ?>
    Код (Text):
    1. array(1) {
    2.   [0]=>
    3.   array(2) {
    4.     [0]=>
    5.     string(31) "<strong>
    6. Привет
    7. </strong>"
    8.     [1]=>
    9.     string(33) "<strong>НеПривет</strong>"
    10.   }
    11. }
    ну фиг знает...
     
  6. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal, с iUms он находит в html коде то что мне надо, но также находит много того, чего мне не надо.
    Вот результат моего RegExp совместно с iUms:
    Код (Text):
    1. <strong>золотой фонд портала</strong></a></li> <li><a href="bestpoemaut.php"><strong>копилка</strong></a></li> </ul> </li> <li><a href="/radio.php" rel="nofollow">радио эфир</a> <ul> <li><a href="/radio.php" rel="nofollow"><strong>эфир</strong></a></li> <!--<li><a href="/avtor.php?author=5&poem=74465" rel="nofollow"><strong>заявки</strong></a></li>--> <li><a href="/avtor.php?author=5&poem=74466" rel="nofollow"><strong>отзывы</strong></a></li> </ul> </li> <li><a href="meropriatia.php">мероприятия портала</a></li> <li><a href="schet.php">дополнительные услуги</a></li> <li><a href="#">издания / публикации</a> <ul> <li><a href="kniga.php"><strong>сборник "среди тычячи звезд"/strong></a></li> <li><a href="/files/litkrim.pdf" rel="nofollow"><strong>газета "литературный крым"</strong></a></li> </ul> </li> <img alt="xds.jpg" /><img alt="xds.jpg" /> <li><a href="bookshop.php">книжная лавка</a></li> <li><a href="#">рубрикатор</a> <ul> <strong>привет друг мой </strong>
    Из этого всего мне надо только <strong>привет друг мой </strong> А он выдает мне еще кучу мусора
     
  7. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ну наверное потому что я искал любую последовательность между открывающимся и закрывающимся тегами, а не только "привет мой друг"

    Код (PHP):
    1. <?php
    2. $str='<strong>золотой фонд портала</strong></a></li> <li>[url="bookshop.php"]книжная лавка[/url]</li>
    3.  <li>[url="#"]рубрикатор[/url] <ul><strong>привет друг
    4.  мой </strong>
    5. <strong> 
    6. Привет
    7. </strong>
    8. <strong>Привет</strong>';
    9. preg_match_all('#<strong>[^<]*привет[^<]*</strong>#iums', $str, $matches);
    10. var_dump($matches); 
    11. ?>
    Код (Text):
    1. array(1) {
    2.   [0]=>
    3.   array(3) {
    4.     [0]=>
    5.     string(47) "<strong>привет друг
    6.  мой </strong>"
    7.     [1]=>
    8.     string(32) "<strong>
    9. Привет
    10. </strong>"
    11.     [2]=>
    12.     string(29) "<strong>Привет</strong>"
    13.   }
    14. }
     
  8. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Ganzal, нет давай я тебе объясню для чего это мне что бы ты помог.
    В общем есть предложение "Привет мой друг"
    Я его разбиваю на слова и в конце каждого слова вырезаю 1-2 символа, то есть окончания могут быть любыми.
    Теперь мне надо найти в огромном HTML коде все теги стронг в которых присутствует вхождения этих фраз с любыми окончаниями.
    Получается как-то так:
    Код (Text):
    1.  
    2. $sregular = '#<strong(.*)>';
    3. for($i=0; $i<count($pieces); $i++) {
    4.     if(mb_strlen($pieces[$i], 'utf-8')<=4) {$pieces[$i] = mb_substr($pieces[$i],0,mb_strlen($pieces[$i], 'utf-8')-1,'utf-8');}
    5.     else {$pieces[$i] = mb_substr($pieces[$i],0,mb_strlen($pieces[$i], 'utf-8')-2,'utf-8');}
    6.     $sregular.=strtolower_my($pieces[$i]).'(.*) *?';
    7. }
    8. $sregular.='</strong>#iums';
    То есть здесь мы выстраиваем Регулярное выражение которое должно искать все теги Strong в огромном html коде в которых присутствует обрезанные вхождения слов.
    То есть по сути он должен искать все подобное этому: <strong>Прив[а-я]+ Мо[а-я]+ Дру[а-я]+</strong>

    Помоги пожалуйста решить эту задачу, второй день не получается сделать
     
  9. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    ахаха, красавчик. ну я пожалуй обойдусь двумя решениями двух поставленных задач. если ты сходу не можешь сформулировать то чего тебе надо, прячешь от нас что-то, то нафига мне вообще тебе помогать? я вот не хочу в третий раз увидеть "нет, это не то что нужно потому что задача в моей голове меняется со скоростью ядерного синтеза"
     
  10. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Регулярные выражения в PHP это муть сплошная...
    В общем спасибо и на том чем уже помог, теперь хотя бы лучше немного.
     
  11. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а где не муть?
     
  12. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Например в Java Script гораздо понятнее RegEXP работает
     
  13. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а там POSIX или PERL? ))))
     
  14. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Если в PHP Perl то там POSIX и наоборот

    Добавлено спустя 11 минут 34 секунды:
    Слушай подскажи вот что, мое рег выражение правильно работает, но оно зацепляет за собой целую кучу мусора, не подскажешь как сделать так, что бы скрипт искал именно нужное мне совпадение и не трогал ничего рядом?
     
  15. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    отлично))) и как же вы реализуете более понятными регулярками JS вашу задачу?
     
  16. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Моя задача сделать это сейчас на PHP а не на Java Script поэтому терять времени не собираюсь, лучше пойду почитаю в инете про регулярки в пиЭйЧпИ
     
  17. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    это не значит что оно правильно работает. правильно работает это когда фактический результат совпадает с ожидаемым.
    какая регулярка-то?
     
  18. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Я уже 1000 вариантов испробовал но так и не достигнул нужного результат....
    В общем вот такая
    Код (Text):
    1.  
    2. |<strong> *?прив(.*)дру(.*)мо(.*)</strong>|iUms
    Должна искать вхождение 3х слов подряд с разным окончаниями

    Добавлено спустя 4 минуты 6 секунд:
    Хотя наверное так было бы точнее

    Код (Text):
    1. |<strong> *?прив.{2,7} *?дру.{2,7} *?мо.{2,7} *?</strong>|iUms
     
  19. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а теперь математику этой регулярки озвучь и увидишь много косяков
     
  20. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    <strong>_Тут много пробелов может быть_Прив_Много Много Символов может быть, то есть окончание __Много пробелов_дру_Много Много Символов может быть, то есть окончание __Много пробелов_мо_Много Много Символов может быть, то есть окончание __Много пробелов_</strong>|не чувствителен к регистру, нежадный шаблон, многострочность(нерабочая),читать одной строкой(нифига не читает)

    Где косяки?
     
  21. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    а? даже мануал сейчас удивился:
     
  22. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    Блин а в JS это читать одной строкой...

    Добавлено спустя 13 минут 38 секунд:
    А ты сам то знаешь как это реализовать?
     
  23. Your

    Your Старожил

    С нами с:
    2 июл 2011
    Сообщения:
    4.074
    Симпатии:
    7
    В <strong></strong> может находиться любая информация?
    Нужно пробовать callback функции для этих целей, и самим делать проверки.
    Или как то умудриться написать условие (проверку на правильность).
    Похоже тут самому придумывать выход придется разложить и записывать.=)
     
  24. Priler

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

    С нами с:
    2 мар 2013
    Сообщения:
    171
    Симпатии:
    0
    Адрес:
    New-York
    В общем пошел учить регулярные выражения, ибо тут помощи ждать нет смысла
     
  25. Ganzal

    Ganzal Суперстар
    Команда форума Модератор

    С нами с:
    15 мар 2007
    Сообщения:
    9.893
    Симпатии:
    965
    Priler, ты давай обидулек-то не кидай. помощь это когда "я делаю вот это но не получается. что не так?". а "сделай раз знаешь" - это в другом разделе. я-то знаю как сделать, и дважды пальцем в небо попал ибо задача была некорректно поставлена. ок, допустим сейчас задача поставлена корректно. теперь словами формулируется логика шаблона и потом уже пишется регулярка. одна, или с колбеками - уже по обстоятельствам.