Вы должны использовать регулярное выражение, которое знает, как сопоставлять теги.
Процедура:
Сделать 2 заменить все проходы на источнике.Вам понадобится обратный вызов, чтобы заменить пробелы подчеркиванием.
Будет объяснен первый, ID , NAME - второй проход (процедура та же).
<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sid\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>
является заменить dall регулярное выражение для ID
Объяснено
# Begin Anchor tag
< a
(?= \s )
(?= # Asserttion (a pseudo atomic group)
( # (1 start), Up to ID attribute
(?: [^>"'] | " [^"]* " | ' [^']* ' )*?
\s id \s* = \s*
) # (1 end)
(?:
( ['"] ) # (2), Quote
( [\S\s]*? ) # (3), ID Value
\2
)
( # (4 start), After ID attribute
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )*?
>
) # (4 end)
)
# Have the ID, just match the rest of tag
\s+
(?: " [\S\s]*? " | ' [\S\s]*? ' | [^>]*? )+
> # End Anchor tag
Внутри обратного вызова группы будут объединены, чтобы сформировать замену
следующим образом.
// сохранить захваченные группы
$ g1 = match.groups [1];
$ g2 = match.groups [2];
$ g3 = match.groups [3];
$ g4 = match.groups [4];
// создаем строку возврата из сохраненных групп захвата
return "<a" + $g1$g2 +
replaceAll($g3, " ", "_") +
// здесь есть функция глобальной замены регулярного выражения
$g2$g4;
Легенда:
группа 1 = до атрибута идентификатора
группа 2 = разделитель значения
группа 3 = значение идентификатора
группа 4 = атрибут после идентификатора
Атрибут Name такой же для обратного вызова, используйте это регулярное выражение для , замените все .
<a(?=\s)(?=((?:[^>"']|"[^"]*"|'[^']*')*?\sname\s*=\s*)(?:(['"])([\S\s]*?)\2)((?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)*?>))\s+(?:"[\S\s]*?"|'[\S\s]*?'|[^>]*?)+>