За последние 24 часа нас посетили 20066 программистов и 1654 робота. Сейчас ищут 1696 программистов ...

По регулярке . Возможно ли такое ?

Тема в разделе "Регулярные выражения", создана пользователем Dima4321, 25 фев 2011.

  1. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Имею контент, нужная мне инфа заключена между тегами.

    Ипсользую preg_math_all

    Вот упрощеная маска для вашего воприятия.

    $poisk='/<div>.+?<div>/si';


    т.е. поясняю.

    Мне нужен контент между двумя началами дивов. Именно меду двумя началами. А не <div>.+?</div> !!


    Отсюда вся и проблема. По такой маске он делает перескок .


    Это текст.

    <div>рыба</div><div>дерево</div><div>тюлень</div><div>морж</div><div>конь</div>


    Моя маска найдет рыба, тюлень,конь

    Зацепится я больше ни за что не могу. Такая маска <div>.+?</div> к моему контенту к сожалению не подходит, есть нюансы


    Внимание а теперь вопрос

    как сделать так чтобы он нашел все слова . Может можно как-то дать понять поиску , что я не хочу , чтобы он перескакивал и использовал второй <div> как начало для новых вхождений.

    Реально ли. ??? Может цикл, может условие иили шшшо -нибудь ??))

    $poisk='/<div>.+?<div>/si';

    Очень прошу помочь ))
     
  2. Jampire

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

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    PHP:
    1. <?php
    2.  
    3. $str = "<div>fish</div><div>tree</div><div>seal</div><div>walrus</div><div>horse</div>";
    4. preg_match_all("#(?=<div>(.*?)<div>)#is", $str, $matches);
    5. echo "<pre>";
    6. print_r($matches[1]);
    7. echo "</pre>";
    8.  
    9. ?>
    На самом деле в $matches[1] стоит на конце каждого элемента закрывающий тег div. Если хотите и его отображать, используйте соответсвующие функции.
     
  3. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Jampire

    Самое главное --- Спасибо ))


    но есть но..((

    в твоем примере как и в моем реальном коде. Псоледний элемент не попадает в массив. В твоем случае horse. Т.к. после него фактичекси нет тега <div>. И условие не срабатывает. Можно что-то придумать ??))

    Так и не понял, как работает сам код. Вижу, что это позиционная проверка. Интерсеный момент : если
    не заключать в скобки (.*?) код отказывается что-либо находить ))
     
  4. VItalijs

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

    С нами с:
    17 дек 2008
    Сообщения:
    244
    Симпатии:
    0
    Адрес:
    Рига, Латвия
    можно добавлять вариативность :

    PHP:
    1. <? preg_match_all("#(?=<div>(.*?)(<div>|</div>$))#is", $str, $matches); ?>
    что-то в таком роде можно пробовать.
     
  5. Gromo

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

    С нами с:
    24 май 2010
    Сообщения:
    2.786
    Симпатии:
    2
    Адрес:
    Ташкент
    а что идёт? отсутствие закрывающего тега - нарушение DOM структуры.
     
  6. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    PHP:
    1. <?php
    2.  
    3. $str = "<div>fish</div><div>tree</div><div>seal</div><div>walrus</div><div>horse</div>";
    4. echo htmlspecialchars($str)."<br>";
    5. preg_match_all("#(?<=(?:<div>))(?:(.*?)(?:<div>|\Z))#is", $str, $matches);
    6. //(?=<div>(.*?)<div>)
    7. echo "<pre>";
    8. print_r($matches[1]);
    9. echo "</pre>";
    10.  
    11. ?>
    12.  
     
  7. Jampire

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

    С нами с:
    22 авг 2009
    Сообщения:
    181
    Симпатии:
    0
    Адрес:
    Гомель
    Ну так вы ж привели задачу: "все что стоит между двумя соседними открывающими тегами". У последнего тега нет соседнего открывающего. Самое простое влепить костыль. Если текст идет динамеческий, добавить в конец div.
    Код (Text):
    1. $text .= "<div></div>";
    Или писать логику забора. Но тут уж сами, мне лень)
    Если не указать позиционную проверку, то каждое последующее совпадение будет удаляться из строки поиска. Поэтому ваша регулярка и не работает. Скрипт нашел совпадение "<div>рыба</div><div>" и удалил его из строки. Поэтому для следующего прохода строка уже имеет вид "дерево</div><div>тюлень</div><div>морж</div><div>конь</div>". Естественно, "дерево" под вашу регулярку не подходит, а подходит "тюлень" и т.д. Позиционная проверка не удаляет найденный элемент. Но также она и не отображает найденные элементы, поэтому надо явно указать карманы.
     
  8. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    /<div>(?:.(?!<div>))+/si
    Расшифровка: ищет все символы начиная от дива за которым не следует другой див
    Пример

    после стрип сделайте

    даже не буду спрашивать зачем это вам надо
     
  9. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0

    titch а шшшооо такое \Z ??))

    И можно пару слов о самом коде ??))
     
  10. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    <?=RPG?>


    Твой код в моем примере вернул псутой массив Array ( )


    Кодtitch захватывает слишком много.
     
  11. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    ?<= позитивный поиск назад
    (?:XXX) группирование без обратной связи
    \Z - принудительный поиск конца строки. Если мне память не изменяет, то при модификаторе "s", выполняет роль конца файла. Если это всё же не так, вам в этом месте нужно на что-либо заменить потом. Иначе будут проблемы, если область поиска - это не одна строка.
     
  12. titch

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

    С нами с:
    18 дек 2010
    Сообщения:
    847
    Симпатии:
    0
    Ты же просил вернуть тебе всё, что находится между <div> и <div>!.. Если тебе не нужны еще </div>, добавь там, где </div>|<div>|\Z
     
  13. Dima4321

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

    С нами с:
    1 апр 2009
    Сообщения:
    683
    Симпатии:
    0
    Ладно ребята не буду пока вас мучать попробую все таки изменить вкорне маску и потом вернусь ))

    Покажу часть кода, возможно задача проста, я слишком тугой ))
     
  14. <?=RPG?>

    <?=RPG?> Активный пользователь

    С нами с:
    19 ноя 2010
    Сообщения:
    451
    Симпатии:
    0
    этого быть не может. Проверьте на регтестере по ссылке. NТем более вашего примера я нигде не увидел
    ссылка