Помогите с рег. выражением по разбору HTML текста

tche

Новичок
Помогите с рег. выражением по разбору HTML текста

Имеем такой текст, в котором встречаются теги IMG


The second method is based on constructing, from the operator <IMG WIDTH="9" HEIGHT="21" BORDER="0" SRC="img7.gif" ALT="$ b$">, a family of operators
<IMG WIDTH="40" HEIGHT="21" ALIGN="ABSMIDDLE" BORDER="0" SRC="img8.gif" ALT="$ \pi_x(b)$"> in the algebra generated by the classical weighted shift operators in
<IMG WIDTH="15" HEIGHT="21" BORDER="0" SRC="img9.gif" ALT="$ l_2$">


Необходимо преобразовать картинки к виду
$ALT

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

Использую след рег. выражение
PHP:
$reg="/<img\s.*align=\"(\w+)\"\s.*src=\"(\w+)\.gif\"\s.*alt=\"(.*)\".*>/Usi";
$text=preg_replace($reg,"[IMG align=$1 alt=$3]$2[/IMG]",$text);
Моя беда в том, что ALIGN встречается не всегда, а если сделать его необязательным, поставить (?:align=\"(\w+)\"\s)?, то перестает запоминать даже там, где align есть ($1 пустой всегда), а если сделать обязательным, то, конечно, картинки с отсутсвующим align не проходят под рег. выражение.

Помогите написать правильное выражение,
Спасибо,
Ч.
 

Z.O.S.

Новичок
А может стоит так: '(align=\"(\w+)\"\s)?' ?

только стоит учесть что в $1 попадет весь алигн, а в $2 будет только его значение!
 

SelenIT

IT-лунатик :)
Может, сделать (?:align=\"(\w+)\"\s)?? необязательным, но жадным?
 

tche

Новичок
?? не работает, все то же самое - $1 пустой:
Жадность уже обеспечивается модификатором U
Array
(
[0] => Array
(
[0] => <IMG WIDTH="9" HEIGHT="21" BORDER="0" SRC="img7.gif" ALT="$ b$">
[1] => <IMG WIDTH="40" HEIGHT="21" ALIGN="ABSMIDDLE" BORDER="0" SRC="img8.gif" ALT="$ \pi_x(b)$">
[2] => <IMG WIDTH="15" HEIGHT="21" BORDER="0" SRC="img9.gif" ALT="$ l_2$">
)

[1] => Array
(
[0] =>
[1] =>
[2] =>
)

[2] => Array
(
[0] => img7
[1] => img8
[2] => img9
)

[3] => Array
(
[0] => $ b$
[1] => $ \pi_x(b)$
[2] => $ l_2$
)

)


Z.O.S.
не понял смысл кавычек ', а так то же самое что и ??
 

SelenIT

IT-лунатик :)
Упс... точно, был не прав. Вот так зато работает:
PHP:
$reg="/<img\s.*(?:align=\"(\w+?)\".*)?src=\"(\w+)\.gif\"\s.*alt=\"(.*)\".*>/Usi";
Не там скобка закрыта была...
 

tche

Новичок
точно, все работает, спасибо, надо было просто перевести .* внутрь скобки.
А в чем смысл ? в выражении (\w+?) ?
 

SelenIT

IT-лунатик :)
В данном случае, пожалуй, смысла действительно нет. А вообще - инверсия жадности для данного квантификатора (+).
 

texrdcom

Новичок
Гдето слышал мысль что программеры деляться на 2 части
1 - знает рег выражения 2- не знают
Но я думаю есть и 3 - которая думает что знает но практически нет!
Я себя отношу к 3 :)
Если стоит задача на сложное рег выражения то мне кажеться
что лутче разбить это выражения на несколько!
И сначало хорошо прикинуть задачу.
 
Сверху