Реклама на сайте Advertise with us
Тема: Помогите с регулярным выражением? Расширенный поиск по форуму
 
Внимание! В связи с устареванием топика эта страница была взята из кэша.
Автор Сообщение
Информация о пользователе bog


Зарегистрирован: 07.11.02
Сообщения: 1595
Ссылка на сообщениеДобавлено: 02/09/03 в 17:15     

3й день бьюсь...
надо из любого ХТМЛ файла,
для примера $html="<b>hhjk </b>suka <b>suka4ok </b>";
вытащить все совпадения искомого слова (к примеру suka) между тагов (к примеру <b> </b>)

т.е. в данном случае хотелось бы получить что то вроде
<b>suka4ok </b>

HELP !!!

K началу

 
Информация о пользователе Alexus


Зарегистрирован: 07.11.02
Сообщения: 722
Ссылка на сообщениеДобавлено: 02/09/03 в 17:20     

perl | php ?

K началу

 
Информация о пользователе bog


Зарегистрирован: 07.11.02
Сообщения: 1595
Ссылка на сообщениеДобавлено: 02/09/03 в 17:29     

пишу на РНР...
последние варианты были

preg_match_all("/<$tag([^<]{1}[^\/]{1}[".substr($tag,0,1)."]{1})*".$term.".*<\/$tag>/isU",$html,$found,PREG_SET_ORDER)

preg_match_all("/<$tag>[^<]+[^\/]+[^".substr($tag,0,1)."]+".$term.".*<\/$tag>/isU",$html,$found,PREG_SET_ORDER)

где
$tag="b"; - таг между которым искать.
$term="suka"; - то что ищем.
$html - исходный ХТМЛ.

(варианты не правильные к сожалению )

Повторю проблему....
надо найти ВСЕ варианты когда искомое слово находиться ВНУТРИ нужного тага. (т.е. искать до первого закрытия тага)

K началу

 
Информация о пользователе Ras


Зарегистрирован: 12.08.03
Сообщения: 5
Ссылка на сообщениеДобавлено: 02/09/03 в 18:21     

А зачем регулярка?
$tag='<b';$ctag='</b';$result=array();
$html=explode ($tag,$html);
потом для каждого элемента $html:
отрезаем все, что после закрывающего тэга
$html[$i]=substr($html[$i],0,strpos($html[$i],$ctag));
ищем
if (strpos($html[$i],$term)>0)
{
и если находим - делаем что надо, например убираем открывающий и закрывающий тэг и запихиваем в массив найденного.
$start=strpos($html[$i],'>');$length=strpos($html[$i],$ctag)-$start;
$new=substr($html[$i],$start,$length);
array_push($result,$new);
}

K началу

 
Информация о пользователе Alexus


Зарегистрирован: 07.11.02
Сообщения: 722
Ссылка на сообщениеДобавлено: 02/09/03 в 19:31     

уточни пож.
между двумя тегами. открвающим и закрывающим может находится любое количество слов? нужно вытаскивать всю строку или только похожее слово? если только слово и если находится несколько похожих слов между парой тегов нужно вытаскивать каждое?

K началу

 
Информация о пользователе bog


Зарегистрирован: 07.11.02
Сообщения: 1595
Ссылка на сообщениеДобавлено: 02/09/03 в 23:17     

1.Да, между тагами может быть любое количество слов и даже ДРУГИЕ таги.
2. точное совпадение словабуеться... т.е. если искомое являеться частью другого - то это нормально.

K началу

 
Информация о пользователе Pentarh


Зарегистрирован: 05.04.03
Сообщения: 1376
Ссылка на сообщениеДобавлено: 03/09/03 в 02:40     

bog писал:
1.Да, между тагами может быть любое количество слов и даже ДРУГИЕ таги.
2. точное совпадение словабуеться... т.е. если искомое являеться частью другого - то это нормально.


-----Сори, не въехал было дело--------

Попробую помочь.

K началу

 
Информация о пользователе Pentarh


Зарегистрирован: 05.04.03
Сообщения: 1376
Ссылка на сообщениеДобавлено: 03/09/03 в 03:56     

Вобщем после двух часов геммороя я понял, что винда не понимает регулярные PCRE выражения, содержащие рекурсию. Да и ну их нах :-)
Альтернатива:
Под воздействием немеряного количества пива вот что получилось:

Код:

<?
$term="suka";
$tag="td";
$html="<b>hhjk </b>suka
<table border=0>
<tr>
<td>
<a href=http://yahoo.com>suka4ok </a> Hi!
</td>
<td>Hello once more suka4ok!</td>
</tr>
</table>";

$r="/(<({$tag})[^>]*>)(.*)(<\/\\2>)/isU";

preg_match_all ($r, $html, $matches, PCRE_EXTENDED);

if (is_array($matches[0]))
{
   for ($i=0; $i< count($matches[0]); $i++)
   {
      if (eregi("$term",$matches[3][$i]))
      {
         echo "Match found: ".$matches[0][$i]."\n";
      }
   }
}
else
   echo "No matches\n";
?>


Ну или так:

Код:

$term="suka";
$tag="b";
$html="<b>hhjk </b>suka
<table border=0>
<tr>
<td>
<b><a href=http://yahoo.com>suka4ok </a> </b>Hi! suka!
</td>
<td>Hello once<b> more <i>suka4ok!</i></b></td>
</tr>
</table>";
.....
(Дальше по тексту)


однако такую конструкцию из-за отсутствия рекурсии он не пойиет правильно:

Код:

$term="suka";
$tag="b";
$html="<b>hhjk <b>suka</b> </b>";
....


Хотя такое довольно редко встречается с тегами форматирования. А вот с тегами таблицы - часто :-(

Если тебя эта проблема смущает, тогда я думаю можно распарсить все вложенности тегов. Или на крайняк применить XML парсер, что-ли? HTML это тоже ведь своеобразный XML (хотя скорей наоборот). Хотя нет. К XML очень жесткие требования синтаксиса, которых нет в HTML. XML парсер наверно закипит от кусочка кода русского вэб-мастера :-)

K началу

 
Информация о пользователе bog


Зарегистрирован: 07.11.02
Сообщения: 1595
Ссылка на сообщениеДобавлено: 03/09/03 в 12:58     

Эх, то на что я надеялся не получилось, но все равно всем спасибо, подали пару идей ;)

K началу

 
Информация о пользователе Pentarh


Зарегистрирован: 05.04.03
Сообщения: 1376
Ссылка на сообщениеДобавлено: 16/09/03 в 09:17     

Кстати, самому себе помог, еще не зная что это будет :-)

Сидел тут голову часа четыре ломал над одним регулярным выражением, а потом вспомнил, что по пьяне когда-то запостил это же выражение сюда.

Вот, теперь пользуюсь :-)

Вывод: Пейте пиво! Ешьте мясо!

K началу

 
Текстовая реклама в форме ответа
Заголовок и до четырех строчек текста
Длина текста до 350 символов
Купить рекламу в этом месте!
Внимание! В связи с устареванием топика эта страница была взята из кэша.

Спонсор раздела Стань спонсором этого раздела!

Реклама на сайте Advertise with us

Опросы

Рецепт новогоднего блюда 2022



Обсудите на форуме обсудить (11)
все опросы »