Вопрос по регулярным выражениям.

Fidget

Новичок
Вопрос по регулярным выражениям.

Проблема в следующем.

из текста нужно выдернуть текст всех ссылок:

Проблем с этим не возникает
PHP:
<a[^>]*>(.*)</a>
но если в ссылке появляется картинка
<a href=""><img>Text</a>
то как выдернуть из этой ссылки текст без картинки?

Пробовал:
PHP:
<a[^>]*>[<img[^>]*>]*(.*)</a>
Как быть...?
 

Fidget

Новичок
[Gisma]
Твой пример работает если в ссылках всегда есть картинки...
А у меня они не всегда есть...

SelenIT
Не понял? Объясни по подробнее...
 

SelenIT

IT-лунатик :)
<img[^>]*> подразумевает совпадение с целой строкой, а не "от нуля до бесконечности символов <, i, m, g, [ ..., >". Значит, и скобки нужны соответствующие.
 

Fidget

Новичок
SelenIT
Напиши пример плыз...
а дальше я сам разбирусь...
 

Franzusow

Новичок
$pattern = '/<a[^>].*>(<img[^>].*>){0,}(.*)<\/a>/imx';
preg_match_all($pattern, $TXT, $array, PREG_SET_ORDER);

print_r($array);
 

SelenIT

IT-лунатик :)
Franzusow
Вариант почти рабочий, есть одна ошибка (дважды) и замечания:
1) [^>]*, а не [^>].*
2) {0,} можно заменить на *
3) зачем модификаторы x и m?
4) по условию задачи <img> захватывать в "карман" не надо: (?:<img[^>]*>)
 

white phoenix

Новичок
Либо с удалением картинок:
PHP:
$string = '<a href...><img src...>text</a>';
$result = preg_match_all('~<a.*?>(.*?)</a>~i',$string,$matches);
$out = array();
foreach($matches[1] as $v) {$out[] = preg_replace('~<img.*?>~i','',$v);}
var_dump($out);
/*
array(1) {
  [0]=>
  string(4) "text"
}
*/
либо с игнорированием:
PHP:
$string = '<a href...><img src...>text</a>';
$result = preg_match_all('~<a.*?>(?:<img.*?>)*(.*?)</a>~i',$string,$matches);
$out = $matches[1];
var_dump($out);
/*
array(1) {
  [0]=>
  string(4) "text"
}
*/
 
Сверху