Я нашел этот полезный код регулярного выражения, когда собирался проанализировать атрибуты HTML-тега:
(\S+)=["']?((?:.(?!["']?\s+(?:\S+)=|[>"']))+.)["']?
Отлично работает, но в нем отсутствует один ключевой элемент, который мне нужен. Некоторые атрибуты являются триггерами событий, в которых есть встроенный код Javascript, например:
onclick="doSomething(this, 'foo', 'bar');return false;"
Или:
onclick='doSomething(this, "foo", "bar");return false;'
Я не могу понять, как заставить исходное выражение не считать кавычки из JS (одинарные или двойные), пока оно вложено в набор кавычек, содержащих значение атрибута.
Я ДОЛЖЕН добавить, что это не используется для разбора всего HTML-документа. Он используется в качестве аргумента в старой функции «выбор массива», которую я обновил. Одним из аргументов является тег, который может добавлять дополнительные атрибуты HTML к элементу формы.
Я сделал улучшенную функцию и осуждаю старую ... но в случае, если где-то в коде есть вызов старой функции, мне нужно, чтобы она была проанализирована в новом формате массива. Пример:
// Old Function
function create_form_element($array, $type, $selected="", $append_att="") { ... }
// Old Call
create_form_element($array, SELECT, $selected_value, "onchange=\"something(this, '444');\"");
Новая версия использует массив пар attr => value для создания дополнительных тегов.
create_select($array, $selected_value, array('style' => 'width:250px;', 'onchange' => "doSomething('foo', 'bar')"));
Это просто проблема обратной совместимости, когда все вызовы OLD-функции направляются в новую, но аргумент $ append_att в старой функции необходимо преобразовать в массив для новой, поэтому мне нужно использовать регулярное выражение для анализа небольших фрагментов HTML. Если есть лучший и легкий способ сделать это, я открыт для предложений.