Что касается методов RegExp для синтаксического анализа (x) HTML, то ответ всем тем, кто говорил о некоторых ограничениях, заключается в следующем: вы недостаточно подготовлены, чтобы управлять силой этого мощного оружия, поскольку NOBODI здесь говорил о рекурсии.
Сотрудник RegExp-agnostic уведомил меня об этом обсуждении, которое, конечно же, не является первым в Интернете по этой старой и горячей теме.
После прочтения некоторых сообщений первый вещь, которую я сделал, искала строку «? R» в этой теме. Второй - искать «рекурсию». Нет, святая корова, не найдено. Поскольку никто не упоминал о главном механизме, на котором построен парсер, я скоро понял, что никто не понял.
Если парсер (x) HTML нуждается в рекурсии, парсер RegExp без рекурсии недостаточно для этой цели , Это простая конструкция.
Черное искусство RegExp сложно освоить, поэтому, возможно, есть еще возможности, которые мы оставили во время тестирования и тестирования нашего личного решения, чтобы захватить всю сеть в одной руке ... Ну , Я уверен в этом:)
Вот волшебный паттерн:
$pattern = "/<([\w]+)([^>]*?)(([\s]*\/>)|(>((([^<]*?|<\!\-\-.*?\-\->)|(?R))*)<\/\\1[\s]*>))/s";
Просто попробуйте. Он написан как строка PHP, поэтому модификатор «s» делает классы include новыми. Вот пример заметки в руководстве по PHP, которое я написал в январе: Ссылка
(Позаботьтесь, в этой заметке я ошибочно использовал модификатор «m», его следует стереть, несмотря на он отбрасывается движком RegExp, поскольку не использовалось no ^ или $ anchorage.
Теперь мы можем говорить о границах этого метода с более информированной точки зрения:
Во всяком случае, это только шаблон RegExp, но он раскрывает возможность разработки множества мощных реализаций. Я написал этот шаблон, чтобы заставить рекурсивный парсер спуска механизма шаблона, который я построил в своей структуре, и производительность действительно велика, как во время выполнения, так и в использовании памяти (ничего общего с другими механизмами шаблонов, которые используйте тот же синтаксис).
Что-то вроде этого достаточно?:
setDefaultIndex(selectedFit, defaults, array, fab) {
const defaultValue = defaults.filter(item => item.fitCode === selectedFit);
let selectedIndex: number = 0;
const id = fab => {
case 'exterior': return defaultValue[0].exteriorFabricCode
case 'body': return defaultValue[0].bodyLiningCode'
case 'sleeve': return defaultValue[0].sleeveLiningCode'
default: false
}
return id(fab) ? array.findIndex(f => f.id === id(fab)) : selectedIndex
}
fab
для ввода значений по умолчанию (fabToKey
). getPredicate
), которая принимает значение и возвращает предикат. setDefaultIndex
получают значение fab
из fabToKey
. Если ключ ложный, верните 0; defaultValue
, используя Array.find()
. Примечание: вам нужно обработать не найденный случай - то есть поиск возвращает null
. findIndex()
с предикатом, созданным путем вызова getPredicate
с defaultValue[key]
. Пример (не тестировался):
const fabToKey = { exterior: 'exteriorFabricCode', body: 'bodyLiningCode', sleeve: 'sleeveLiningCode' };
const getPredicate = value => ({ id }) => id === value;
setDefaultIndex(selectedFit, defaults, array, fab) {
const key = fabToKey[fab];
if (!key) return 0;
const defaultValue = defaults.find(item => item.fitCode === selectedFit);
// do something if defaultValue is null - ie selectedFit wasn't found
return array.findIndex(getPredicate(defaultValue[key]));
}