Мне кажется, вы пытаетесь сопоставить теги без «/» в конце. Попробуйте следующее:
<([a-zA-Z][a-zA-Z0-9]*)[^>]*(?<!/)>
Если существует некоторый другой символ, это недопустимо в именах пользователей, можно определить различный символ разделителя с помощью малоизвестного синтаксиса:
...GROUP_CONCAT(name SEPARATOR '|')...
... Вы хотите позволить каналы? или какой-либо символ?
Escape символ разделителя, возможно, с обратной косой чертой, но прежде, чем сделать тот Escape сами обратные косые черты:
group_concat(replace(replace(name, '\\', '\\\\'), '|', '\\|') SEPARATOR '|')
Это будет:
, Чтобы получить незавершенные результаты, сделать то же самое в обратном порядке:
(?<!\\)(?:\\\\)*\|
Пример:
... GROUP_CONCAT(REPLACE(name, ',', '\\,'))
Примечание необходимо использовать двойную обратную косую черту (при выходе из запятой с обратной косой чертой), потому что сама обратная косая черта является волшебной, и \,
становится просто ,
.
Если Вы собираетесь быть выполнением декодирования в Вашем приложении, возможно, просто используйте hex
:
SELECT GROUP_CONCAT(HEX(foo)) ...
или Вы могли также поместить длину в них:
SELECT GROUP_CONCAT(CONCAT(LENGTH(foo), ':', foo)) ...
Не то, чтобы я протестировал любой:-D
какая зарубка, сказанная действительно, с улучшением - разделитель может быть больше чем одним символом также.
я часто использовал
GROUP_CONCAT(name SEPARATOR '"|"')
, Возможности имени пользователя, содержащего "|", являются довольно низкими, я сказал бы.
Вы входите в ту серую область, где могло бы быть лучше постобработать эту внешнюю сторону мир SQL.
, По крайней мере, это - то, что я сделал бы: я был бы просто ORDER BY вместо GROUP BY и цикл через результаты обработать группировку как фильтр, сделанный на клиентском языке:
last_id
к ПУСТОМУ УКАЗАТЕЛЮ , Если идентификатор строки отличается, чем last_id
, запускают новую выходную строку:
a., если last_id
не является ПУСТЫМ тогда, производят сгруппированную строку
, b. устанавливают новую сгруппированную строку = входная строка, но хранят имя как единственный массив элемента
, c. устанавливают last_id
на значение текущего идентификатора
Иначе (идентификатор совпадает с last_id
), добавляют название строки на существующую сгруппированную строку.
last_id
не является ПУСТЫМ, тогда производит существующую строку группы. Тогда Ваш вывод заканчивается включая имена, организованные как массив, и может решить, как Вы хотите обрабатывать/выходить/форматировать их тогда.
, Какой язык/систему Вы используете? PHP? Perl? Java?
Jason S: Это - точно проблема, с которой я имею дело. Я использую платформу PHP MVC и обрабатывал результаты как Вы, описывают (несколько строк на результат и код для собирания в группу результатов). Однако я работал над двумя функциями для своих моделей для реализации. Каждый возвращается, список всех необходимых полей должен был воссоздать объект, и другой функция, которая, учитывая строку с полями от первой функции, инстанцируйте нового объекта. Это позволяет мне запросить строку от базы данных и легко возвратить ее в объект, не зная внутренности данных, необходимых модели. Это не работает вполне также, когда несколько строк представляют один объект, таким образом, я пытался использовать GROUP_CONCAT для обхождения той проблемы.
Прямо сейчас я позволяю любой символ. Я понимаю, что канал вряд ли обнаружился бы, но я хотел бы позволить его.
Как насчет управляющего символа, который необходимо разделять из входа приложения так или иначе? Я сомневаюсь, что Вам нужно, например, вкладка или новая строка в поле имени.
Я бы предложил GROUP_CONCAT (имя SEPARATOR '\ n'), поскольку \ n обычно не встречается. Это может быть немного проще, так как вам не нужно ничего избегать, но это может привести к неожиданным проблемам. Кодирование / декодирование регулярных выражений, предложенное ником, конечно, тоже хорошо.