Показать полную графическую версию : регулярные или както еще?
а как выцепить из текста, в масив, все теги 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
спасиб большое:)
пятью часами бы раньше, хех:)
я вот так сделал:
preg_match_all("/(<button[^>]*disabled>[^>]*<\/button>)/",$in, $mass);
и считываю из масива $mass[1]
echo "<textarea cols=20 rows=20>";
foreach($mass as $i)
echo $i."\n";
echo "</textarea>";
самое интересное что со знаком вопроса не работает.
и вообще что ето такой за знак вопроса? читал что обозначает любое определенное количество символов и метасимволов. но както это определение не внушает:/
vadimiron
20-03-2005, 20:16
самое интересное что со знаком вопроса не работает.
и вообще что ето такой за знак вопроса? читал что обозначает любое определенное количество символов и метасимволов. но както это определение не внушает:/
Знак вопроса обозначает, что символ перед знаком вопроса встречается один или ноль раз
Например, на той запрос: ранн?ий, функция регулярок примет следущие два варианта правильными: раний, ранний
vadimiron
а плюс тогда что??
{1,} ?
vadimiron
21-03-2005, 00:38
+ означает, что предыдущий сомвол повторяется один или большее число раз
{min,max} - задаёт диапозон повторения, то есть от min до max, может также только одно значение быть, например {min,} или {,max}, то есть в данном конкретном случае {1,} обозначает тоже самое, что и +
vadimiron
а если комбинацию надо повторить несколько раз?
т.е. например что такое <button[^>] повторяется семь раз?
и вообще что ето такой за знак вопроса?
А еще знак вопроса означает поиск минимально возможного числа символов.
preg_match('/<button.*?disabled>(.*?)<\/button>/',$text, $mass);
Вот такое выражение значит:
- найти минимальное количество элементов стоящих от <button до disabled
- найти и запомнить в mass минимальное количество элементов, стоящих от disabled> до </button>
mrcnn
и как это понять минемально?
минемальней чем что? и без чего?
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 скриптов:
Первый:
$text="<button disabled>g</button>kl<button disabled></button>jghjklh <button value=23432 size=fgkjheop color=kjjkh disabled></button>";
preg_match('/<button.*<\/button>/',$text, $mass);
print $mass[0];
Второй
$text="<button disabled>g</button>kl<button disabled></button>jghjklh <button value=23432 size=fgkjheop color=kjjkh disabled></button>";
preg_match('/<button.*?<\/button>/',$text, $mass);
print $mass[0];
Разница между скриптами только в знаке вопроса.
Чтобы сделать это:
а как выцепить из текста, в масив, все теги button с атрибутом disabled и все что между ним (<button disabled>все что между ним</button>)?
можно использовать выражение preg_match_all('/<button.*?disabled>(.*?)<\/button>/',$text, $mass);
(Я привел раньше неправильный вариант, где знак вопроса стоял за пределами скобок)
$text="<button disabled>g</button>kl<button disabled></button>jghjklh <button value=23432 size=fgkjheop color=kjjkh disabled></button>";
preg_match_all('/<button.*?disabled>(.*?)<\/button>/',$text, $mass);
foreach($mass as $i)
foreach ($i as $j)
echo $j."\n";
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.