![]() |
регулярные или както еще?
а как выцепить из текста, в масив, все теги button с атрибутом disabled и все что между ним (<button disabled>все что между ним</button>)?
причем таких тегов может быть очень много и все они могут содержать дополнительные совершенно не одинаковые атрибуты или вообще без атрибутов: <button disabled>g</button>kl<button disabled></button>jghjklh <button value=23432 size=fgkjheop color=kjjkh disabled></button> нужно все вывести в массив... т.е. $mass[]="<button disabled если_есть_атрибуты>если_чтото_было_между_ним</button>"; подскажите как плызз.. |
В своё время мне помогла разобраться в рег.выражениях эта статья http://detail.phpclub.ru/article/regexp_1
|
Примерно так:
preg_match('/<button.*?disabled>(.*)?<\/button>/',$text, $mass) в mass[1] все что между тэгами. в php 4-ой версии, однако, конструкция с вопросительным знаком .*? и (.*)? очень глючно работает (по сравнению с Перлом). поэтому в mass[1] может оказаться и мусор. |
scazy замечательная ссылка,только много ошибок, я там комментарий оставил, промодерируется высветится.
mrcnn а если я хочу отдельно получать контент между тегом и весь тег с контентом в разные массивы?.. |
и зачем сдесь обратный слеш?..
>(.*)?<\/button |
Обратный слэш показывает, что следующий за ним символ должен восприниматься как обычный символ, а не как специальный. Если не поставить \ перед / , то скрипт может подумать, что первым слэшем / заканчивается регулярное выражение (а он заканчивается на самом деле вторым) и выдаст ошибку.
Значение точки в регулярных выражениях - 1 любой символ . Если я хочу , чтобы скрипт воспринимал ее только как точку (а не как любой символ), то надо поставить перед ней обратный слэш. На 1 вопрос: точно не знаю. Можно попробовать использовать цикл и создание динамических переменных с именем, в который включается счетчик. |
mrcnn
спасиб большое:) пятью часами бы раньше, хех:) я вот так сделал: PHP код:
PHP код:
и вообще что ето такой за знак вопроса? читал что обозначает любое определенное количество символов и метасимволов. но както это определение не внушает:/ |
Цитата:
Например, на той запрос: ранн?ий, функция регулярок примет следущие два варианта правильными: раний, ранний |
vadimiron
а плюс тогда что?? {1,} ? |
+ означает, что предыдущий сомвол повторяется один или большее число раз
{min,max} - задаёт диапозон повторения, то есть от min до max, может также только одно значение быть, например {min,} или {,max}, то есть в данном конкретном случае {1,} обозначает тоже самое, что и + |
vadimiron
а если комбинацию надо повторить несколько раз? т.е. например что такое <button[^>] повторяется семь раз? |
Цитата:
preg_match('/<button.*?disabled>(.*?)<\/button>/',$text, $mass); Вот такое выражение значит: - найти минимальное количество элементов стоящих от <button до disabled - найти и запомнить в mass минимальное количество элементов, стоящих от disabled> до </button> |
mrcnn
и как это понять минемально? минемальней чем что? и без чего? |
Цитата:
По умолчанию происходит поиск максимально возможного числа элементов включаемых в .* Например, если в переменной записано следующее: $text="<button disabled>g</button>kl<button disabled></button>jghjklh button value=23432 size=fgkjheop color=kjjkh disabled></button>"; И нам нужно найти текст от <button до первой встречающейся после него </button> Выражение preg_match('/<button.*<\/button>/',$text, $mass); сработает таким образом, что в первый .* будет включено все стоящее от первой < button до последней </button>. То есть произойдет поиск максимально возможного числа элементов стоящего между <button и </button>. Чтобы такого не произошло и был найден текст до первой </button> (это значит, что надо искать минимально возможное число элементов между <button и </button>), нужно поставить знак вопроса после .* и таким образом, получаем preg_match('/<button.*?<\/button>/',$text, $mass); Для наглядности выполни и сравни результаты 2 скриптов: Первый: PHP код:
PHP код:
Чтобы сделать это: Цитата:
(Я привел раньше неправильный вариант, где знак вопроса стоял за пределами скобок) PHP код:
|
Время: 10:21. |
Время: 10:21.
© OSzone.net 2001-