Ваше регулярное выражение серьезно нарушено:
- Похоже, вы используете символ вставки (^) как "не" - он имеет значение только внутри классов символов; в другом месте это означает «начало ввода».
- Ваша точка должна быть экранирована, или она будет соответствовать любому символу.
- Число, которому предшествует знак равенства или двоеточие, всегда начинается с границы (как = и: не \ w, а цифры) - поэтому необходим только \ b.
Я настоятельно рекомендую прочитать хороший справочник по регулярным выражениям - "man perlre" был моим источником много лет назад, но я уверен, что сейчас есть и лучшие.
Следующее должно делать то, что вы хотите, предполагая, что числа начинаются и заканчиваются на границе, не имеют разделителей тысяч и используют точку в качестве десятичного разделителя, что времена и даты являются последовательностями чисел, разделенных ":", " - ", или" / ", и что такими последовательностями чисел являются время и дата. Это должно быть легко улучшить, если эти предположения не верны.
/\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/
Пояснение:
- (? <! ...) негативное оглядывание, исключая все, что вы не хотите видеть ДО ваших номеров. </li>
- (\ d + (?:. \ D +)?) Число с целой и десятичной частью, захватывая только одну группу
- (?! ...) отрицательный прогноз, исключая все, что вы не хотите видеть ПОСЛЕ ваших номеров.
Заметьте, я также предполагаю, что у вас нет цифр, начинающихся с "& #", но за которыми не следует ";". Кодирование вашего регулярного выражения, если это предположение не выполняется, является более сложной проблемой.
Тест:
$ pcretest
PCRE version 7.8 2008-09-05
re> /\b(?<!&#|\d[:\/-])(\d+(?:\.\d+)?)(?!%|[:\/-]\d)\b/g
data> a12
No match
data> a 12
0: 12
1: 12
data> 12-12
No match
data> 12:12
No match
data> 12 23
0: 12
1: 12
0: 23
1: 23
data> 
No match
data> :12
0: 12
1: 12
data> =12
0: 12
1: 12
data> 12/12
No match
data> 12%
No match