Имею контент, нужная мне инфа заключена между тегами. Ипсользую 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'; Очень прошу помочь ))
PHP: <?php $str = "<div>fish</div><div>tree</div><div>seal</div><div>walrus</div><div>horse</div>"; preg_match_all("#(?=<div>(.*?)<div>)#is", $str, $matches); echo "<pre>"; print_r($matches[1]); echo "</pre>"; ?> На самом деле в $matches[1] стоит на конце каждого элемента закрывающий тег div. Если хотите и его отображать, используйте соответсвующие функции.
Jampire Самое главное --- Спасибо )) но есть но..(( в твоем примере как и в моем реальном коде. Псоледний элемент не попадает в массив. В твоем случае horse. Т.к. после него фактичекси нет тега <div>. И условие не срабатывает. Можно что-то придумать ??)) Так и не понял, как работает сам код. Вижу, что это позиционная проверка. Интерсеный момент : если не заключать в скобки (.*?) код отказывается что-либо находить ))
можно добавлять вариативность : PHP: <? preg_match_all("#(?=<div>(.*?)(<div>|</div>$))#is", $str, $matches); ?> что-то в таком роде можно пробовать.
PHP: <?php $str = "<div>fish</div><div>tree</div><div>seal</div><div>walrus</div><div>horse</div>"; echo htmlspecialchars($str)."<br>"; preg_match_all("#(?<=(?:<div>))(?:(.*?)(?:<div>|\Z))#is", $str, $matches); //(?=<div>(.*?)<div>) echo "<pre>"; print_r($matches[1]); echo "</pre>"; ?>
Ну так вы ж привели задачу: "все что стоит между двумя соседними открывающими тегами". У последнего тега нет соседнего открывающего. Самое простое влепить костыль. Если текст идет динамеческий, добавить в конец div. Код (Text): $text .= "<div></div>"; Или писать логику забора. Но тут уж сами, мне лень) Если не указать позиционную проверку, то каждое последующее совпадение будет удаляться из строки поиска. Поэтому ваша регулярка и не работает. Скрипт нашел совпадение "<div>рыба</div><div>" и удалил его из строки. Поэтому для следующего прохода строка уже имеет вид "дерево</div><div>тюлень</div><div>морж</div><div>конь</div>". Естественно, "дерево" под вашу регулярку не подходит, а подходит "тюлень" и т.д. Позиционная проверка не удаляет найденный элемент. Но также она и не отображает найденные элементы, поэтому надо явно указать карманы.
/<div>(?:.(?!<div>))+/si Расшифровка: ищет все символы начиная от дива за которым не следует другой див Пример после стрип сделайте даже не буду спрашивать зачем это вам надо
?<= позитивный поиск назад (?:XXX) группирование без обратной связи \Z - принудительный поиск конца строки. Если мне память не изменяет, то при модификаторе "s", выполняет роль конца файла. Если это всё же не так, вам в этом месте нужно на что-либо заменить потом. Иначе будут проблемы, если область поиска - это не одна строка.
Ты же просил вернуть тебе всё, что находится между <div> и <div>!.. Если тебе не нужны еще </div>, добавь там, где </div>|<div>|\Z
Ладно ребята не буду пока вас мучать попробую все таки изменить вкорне маску и потом вернусь )) Покажу часть кода, возможно задача проста, я слишком тугой ))
этого быть не может. Проверьте на регтестере по ссылке. NТем более вашего примера я нигде не увидел ссылка