Помогите со сложной регуляркой для обработки 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=' "
Помогите плиз, а то ночью туплю уже... А спать не хочется :-)
 
Если 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>';
 
а выбрать всю оставшуюся внутри тэга строку и потом разбивать ее на параметры никак? или воспользоваться тем же tidy тож не подходит? надо именно через регулярки, которые для поиска аттрибутов не предназначались?
 
Andreika
Не надо мне объяснять почему я дурак. Я и сам знаю.

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

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

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

Именно в этом и нужна помошь. Предлагать переделать не надо, я сам знаю все возможные варианты.
 
Одним выражением, имхо, этого не сделать, но можно поизвращаться:
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>';
 
sage

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