Помогите со сложной регуляркой для обработки HTML

alexhemp

Новичок
Помогите со сложной регуляркой для обработки HTML

Итак, у меня есть регулярное выражение которое выделяет все ссылки в документе

Код:
/(<a[^>]*\shref=)['\"]?((?!mailto:)(?!\/)[^>'\"]*)['\"]?((|\s[^>]*)>)/is
строку до адреса, адрес, строку после адреса

Никак не могу понять как сделать вот такую штуку

При модификации визуального редактора добавили новый внутренний атрибут direct

Т.е. могут появиться ссылки:
<a href="http://test.ru" direct="true">
<a direct="true" href="http://test.ru">

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

Я понимаю как выразить в регах "любая последовательность символов кроме" - это [^>]* - т.е. любые кроме ">"
А вот как сделать "любая последовательность символов кроме > и не последовательности 'direct=' "
Помогите плиз, а то ночью туплю уже... А спать не хочется :)
 

sage

Новичок
Если direct="true" вставляется непосредственно после a или после href, , то можно попробовать выражение:
PHP:
echo '<pre>';
preg_match_all('/<a(?! direct)[^>]+href="([^"]+)"(?! direct)[^>]*>/i', '<a direct="true" href="http://test.ru"></a><a href="http://test.ru"></a><a href="http://test.ru" direct="true"></a><a href="http://test.ru" target="_blank"></a><a target="_blank" href="http://test.ru"></a>', $matches, PREG_SET_ORDER);
var_dump($matches);
echo '</pre>';
 

Andreika

"PHP for nubies" reader
а выбрать всю оставшуюся внутри тэга строку и потом разбивать ее на параметры никак? или воспользоваться тем же tidy тож не подходит? надо именно через регулярки, которые для поиска аттрибутов не предназначались?
 

alexhemp

Новичок
Andreika
Не надо мне объяснять почему я дурак. Я и сам знаю.

Нужна помощь в конкретном вопросе - как выразить на языке регулярных выражений "любая последовательность символов кроме > и не содержащая последовательности 'direct' "

Фактически я сейчас получаю строку которая
1. Начинается с '<a'
2. Кончается на '>'
3. Содержит между '<a' и '>' последовательность 'href=что-то'

Теперь я хочу добавить условие, чтобы строка 'direct' не содержалась между <a и href='что-то' и между href='что-то' и '>'

Именно в этом и нужна помошь. Предлагать переделать не надо, я сам знаю все возможные варианты.
 

sage

Новичок
Одним выражением, имхо, этого не сделать, но можно поизвращаться:
PHP:
$links = array();
echo '<pre>';
preg_replace_callback('/<a([^>]+)href="([^"]+)"([^>]*)>/i', create_function('$matches',
'if (!preg_match("#direct#", $matches[1]) && !preg_match("#direct#", $matches[3])) $GLOBALS["links"][] = $matches[2];'), '...');
var_dump($links);
echo '</pre>';
 

alexhemp

Новичок
sage

Спасибо! Буду думать...
Попробую что-нить в духе [^>]*(?!direct)[^>]*
 
Сверху