Помогите с регулярным выражением!

12
[Удален]
741

Есть строки в файле вида:

<span class="ec_b_11" dir="ltr">PPI Input</span>

я ее выдираю выражением

preg_match_all('/<span class="ec_b_11" dir="ltr">(.*)<\/span>/isU',$str,$array)


все отлично. Проблема вот в чем, такая строка бывает встречается 2 раза, а парсить ее надо как одну, например

<span class="ec_b_11" dir="ltr">PPI Input</span><span class="ec_b_11" dir="ltr">(WoW)</span>


, т.е. на выходе должно получится "PPI Input (WoW)";

Нужно чтобы как-то соединяло две строки с одинаковыми тегами, которые идут подряд, и нужно чтобы работал и первый и второй вариант.

P
На сайте с 19.03.2009
Offline
17
#1

надо убрать модификатор "U"

Помогу с вёрсткой, html, css, js, jquery, php, mysql ($) icq 8938933 Быстрый, удобный и недорогой хостинг (http://sweb.ru/p17046) Виза в Великобританию (http://www.englishexpert.ru/velikobritaniya/viza/viza-v-velikobritaniu/)
[Удален]
#2

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

/<span class="ec_b_11" dir="ltr">(.*)<\/span>[<span class="ec_b_11" dir="ltr">(.*)<\/span>]?/isU

т.е. условие, что второй спан может быть, а может и не быть. Но проблема в том, что он все равно когда идут подряд спаны, он ищет по первой части выражения и находит его. Если же убрать это условие, тогда ищется только два спана подрят, а мне надо чтоб искало и один, а когда два спана, обьединяло их в одну строчку

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#3

Собссна в результате работы функции получаем:

Array

(
[0] => Array
(
[0] => <span class="ec_b_11" dir="ltr">PPI Input</span>
[1] => <span class="ec_b_11" dir="ltr">(WoW)</span>
)

[1] => Array
(
[0] => PPI Input
[1] => (WoW)

)

)
т.е. на выходе должно получится "PPI Input (WoW)";

echo $array[1][0].$array[1][1];

A
На сайте с 19.07.2010
Offline
130
#4
echo $array[1][0].$array[1][1];

правильнее будет:

echo implode(' ', $array[1]);

.............
[Удален]
#5
Алексей Барыкин:

echo $array[1][0].$array[1][1];

Я хотел так сделать, но не получается, потому что я не знаю когда будет 2 span подряд, а когда один.

вот конкретный пример


<span>Текст 1</span>
[другие теги]
<span>Текст 2</span><span>Дополнение к тексту 2</span>
[другие теги]
<span>Текст 3</span>
[другие теги]
<span>Текст 4</span><span>Дополнение к тексту 4</span>

Т.е на выходе должно быть

Текст 1

Текст 2 Дополнение к тексту 2

Текст 3

Текст 4 Дополнение к тексту 4

ну а в результате работы моего кода


if(preg_match_all('/<span class="ec_b_11" dir="ltr">(.*)<\/span>/isU',$str,$array))
{
for($i=0; $i<sizeof($array[1]); $i++)
{
$ar[$i][title] = $array[1][$i];
echo $ar[$i][title].'<br>';
}
}

выводит

Текст 1

Текст 2

Дополнение к тексту 2

Текст 3

Текст 4

Дополнение к тексту 4

PS: извините если туплю в чем-то, но понять не могу никак

Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#6

И что не нравится?

[Удален]
#7
Алексей Барыкин:
И что не нравится?

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

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

SP
На сайте с 20.05.2008
Offline
56
#8

Так объединяйте всегда :) А если все же нужно для чего-то знать сколько найдено вхождений - проверяйте количество элементов соответствующего массива.

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

SeoProger добавил 10.10.2010 в 13:33

Кстати, если парсится таблица, то может имеет смысл парсить по ячейкам таблицы, а не по спанам?

Делаю небольшие заказы на php, perl, js/ajax, delphi; парсеры, простые сайты с админкой, установка\настройка sape, wordpress и др. Мой Блог (http://www.seoproger.ru)
Алексей Барыкин
На сайте с 04.02.2008
Offline
272
#9
Armax:


Т.е на выходе должно быть
Текст 1

Текст 2 Дополнение к тексту 2
Текст 3
Текст 4 Дополнение к тексту 4


ну а в результате работы моего кода

...

выводит
Текст 1

Текст 2
Дополнение к тексту 2
Текст 3
Текст 4
Дополнение к тексту 4


PS: извините если туплю в чем-то, но понять не могу никак

И что не нравится?

Тексты совпадают. (ну кроме форматирования)

[Удален]
#10
SeoProger:

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

Да, задача именно такая.

SeoProger:

SeoProger добавил 10.10.2010 в 13:33
Кстати, если парсится таблица, то может имеет смысл парсить по ячейкам таблицы, а не по спанам?

Там таблица в таблице, и не вся таблица парсится, в общем проще по спанам именно это поле распарсить.

Алексей Барыкин:
И что не нравится?

вот в этой строчке не нравится

$ar[$i][title] = $array[1][$i];


т.к. парсится таблица, то данные из разных столбцов должны соответствовать индексу массива,

пример есть поля $ar[$i][name], $ar[$i][date] и индекс у них должен быть такой же как и у $ar[$i][title] (то что я выдираю из спанов) а, тк. спанов больше чем строк в таблице все данные сбиваются

12

Авторизуйтесь или зарегистрируйтесь, чтобы оставить комментарий