preg_match_all - помогите разобраться

mac

Guest
preg_match_all - помогите разобраться

Уважаемые, помогите разобраться.
Есть кусок html-кода, в котором присутствует большое количество строк:
<a class=n href="ссылка">nbsp;nbsp;nbsp;текст ссылки</a>
и
<a class=n href="ссылка">nbsp;<b>текст ссылки</b></a>

необходимо вытащить оттуда "ссылку" и "текст ссылки".
С вытаскиванием "ссылки" проблем нет. С отбрасыванием разного количества nbsp; тоже. А вот с тегами <b> и </b> - проблема, не могу их откинуть.

Вот сам шаблон:
preg_match_all("|<a class=n href=\"(.*)\">[nbsp;][nbsp;]{5,17}+(.*)</a>|Usi", $first, $third_step);
 

sage

Новичок
немного не понятно, что означает плюсик после {5,17}?

-~{}~ 16.06.05 21:50:

а как ты их откидываешь, если во 2 карман сохраняется всё то, что следует после nbsp;?
 

mac

Guest
я откидываю все nbsp; и еще нужно откинуть теги <b></b>, т.е. мне нужны только "ссылка" и "текст ссылки"
 

sage

Новичок
mac
ты, похоже, не читаешь ответы... Ты на мой вопрос можешь дать ответ?
 

mac

Guest
Автор оригинала: sakon
mac
Обясни, что означает эта конструкция
[nbsp;][nbsp;]{5,17}+
и найди ее во втором примере

А вобщем то тебе сюда -> PHP FAQ: Регулярные выражения.
там я уже был, и на основе этого делал шаблон...
этой конструкцией ( [nbsp;][nbsp;]{5,17}+ ) я откидываю ненужные nbsp;, их ведь разное количество может быть - опять же, руководствовался мануалом...
может я что-то и не так понял..
поэтому и спрашиваю
 

Serguitar

Новичок->продвинутый
mac
Однозначно, ты не совсем так понял то, что прочёл.
Но подход твой правильный. У тебя были ещё варианты? Покажи.
 

mac

Guest
этот вариант единственный, который позволяет отбросить nbsp;, остальные откидывали либо один символ, либо один nbsp;

preg_match_all("|<a class=n href=\"(.*)\">(&nbsp\;)+(.*)</a>|Usi", $first, $third_step);

preg_match_all("|<a class=n href=\"(.*)\">(.+&nbsp;)(.*)</a>|Usi", $first, $third_step);

preg_match_all("|<a class=n href=\"(.*)\".*?(\&nbsp\;)+(.*)</a>|Usi", $first, $third_step);

preg_match_all("|<a class=n href=\"(.*)\">&nbsp;(.*)(.*?)</a>|Usi", $first, $third_step);

не факт, что они рабочие - я просто комментировал неподходящий шаблон и брался за новый..
 

rooot

Новичок
PHP:
$patterns[0] = "/<b>/";
$patterns[1] = "/</b>/";
$replacements[0] = "";
$replacements[1] = "";
$content= preg_replace($patterns, $replacements, $string);
должны исчезнуть.
 

mac

Guest
Автор оригинала: rooot
PHP:
$patterns[0] = "/<b>/";
$patterns[1] = "/</b>/";
$replacements[0] = "";
$replacements[1] = "";
$content= preg_replace($patterns, $replacements, $string);
должны исчезнуть.
спасибо, но интересует такая вещь как скорость обработки - скажется ли это на ней. таких строк порядка 500
 

rooot

Новичок
mac
$content= preg_replace($patterns, $replacements, $string);
по моему все дело в ней, а она одна)))))))))
 

sage

Новичок
mac
не делай так, как посоветовал rooot

вот, например, одно из решений:

Код:
~<a class=n href="(.+?)">(?:.*?<b>)?(.+?)(?:<\/b>)?<\/a>~si
-~{}~ 16.06.05 23:30:

без пробелов после b>
 

mac

Guest
это точно )))))
спасибо, буду пробовать..

-~{}~ 16.06.05 16:45:

Автор оригинала: sage
mac
не делай так, как посоветовал rooot

вот, например, одно из решений:

Код:
~<a class=n href="(.+?)">(?:.*?<b>)?(.+?)(?:<\/b>)?<\/a>~si
-~{}~ 16.06.05 23:30:

без пробелов после b>
в твоем примере отлавливаются только строки, в которых содержится <b></b> - но попробую немного модифицировать его....
 

Alex2003

Новичок
Автор оригинала: mac
это точно )))))
спасибо, буду пробовать..

-~{}~ 16.06.05 16:45:


в твоем примере отлавливаются только строки, в которых содержится <b></b> - но попробую немного модифицировать его....
может эта...
PHP:
str_replace();
'<b>' => ''
'</b>' =>''
&nbsp; => ''
и потом preg_match_all();
?
 

kvf77

Red Devil
mac

Ну по простому, можно сначала выкинуть все теги кроме <a> из файла, а потом парсить. В PHP есть для этого функция strip_tags (Эта функция возвращает строку str, из которой удалены HTML и PHP тэги):
strip_tags('text', '<a>');
После отработки все теги ктоме <a> исчезнут, а остальное ты умеешь обрабатывать.
 

sage

Новичок
mac
Код:
#<a class=n href="(.+?)">(?:.*?<b>|(?:nbsp;)+)?(.+?)(?:<\/b>)?<\/a>#si
-~{}~ 17.06.05 08:24:

вместо смайлика - точка с запятой и )
без пробела после <\/b>
 

mac

Guest
Автор оригинала: kvf77
mac

Ну по простому, можно сначала выкинуть все теги кроме <a> из файла, а потом парсить. В PHP есть для этого функция strip_tags (Эта функция возвращает строку str, из которой удалены HTML и PHP тэги):
strip_tags('text', '<a>');
После отработки все теги ктоме <a> исчезнут, а остальное ты умеешь обрабатывать.
скорее всего так и поступлю, спасибо...
 

mac

Guest
Автор оригинала: sage
mac
Код:
#<a class=n href="(.+?)">(?:.*?<b>|(?:nbsp;)+)?(.+?)(?:<\/b>)?<\/a>#si
-~{}~ 17.06.05 08:24:

вместо смайлика - точка с запятой и )
без пробела после <\/b>
вылавливает только первый символ "текста ссылки",
может у меня просто настройки другие - поковыряю...
все равно спасибо
 

sage

Новичок
приведи код, при котором вылавливает только первый символ "текста ссылки" - исправим
 
Сверху