Не могу справиться с регуляркой для поиска html тега

Есть вот такой код

<label class="col-sm-2 control-label" for="input-unit_border_active_color"><?= $entry_border_active_color ?></label><div class="col-sm-10"><input data-mark="<?= $mark ?>" size="60" type="text" name="unit_border_active_color" value="<?= $border_active_color ?>"></div>

Не получается написать регулярку, которая сможет извлечь весь тег по слову unit_border_active_color. Регулярка <(|'[^']*'|[^'">])*> возвращает любые валидные теги, а мне нужен только один,в котором есть последовательностьunit_border_active_color. Я не знаю как добавить исключение в эту регулярку, чтобы результат был такой:

<input size="60" type="text" name="unit_border_active_color" value="<?= $border_active_color ?>">

Ответы (1 шт):

Автор решения: UModeL

Для вашего случая, в PHP регулярное выражение и код будут такими:

$re = '/.*?(<input[\s\S]*\bunit_border_active_color\b[\s\S]*>)(?=<).*/mi';

$str = '<label class="col-sm-2 control-label" for="input-unit_border_active_color"><?= $entry_border_active_color ?></label><div class="col-sm-10"><input data-mark="<?= $mark ?>" size="60" type="text" name="unit_border_active_color" value="<?= $border_active_color ?>"></div>';

echo htmlspecialchars(preg_replace($re, '$1', $str), ENT_QUOTES);

Рабочий пример на JS:

let rExp = /.*?(<input[\s\S]*\bunit_border_active_color\b[\s\S]*>)(?=<).*/gim;
let sHtml = `<label class="col-sm-2 control-label" for="input-unit_border_active_color"><?= $entry_border_active_color ?></label><div class="col-sm-10"><input data-mark="<?= $mark ?>" size="60" type="text" name="unit_border_active_color" value="<?= $border_active_color ?>"></div>`;
console.log(sHtml.replace(rExp, '$1'));

→ Ссылка