업데이트 : CSS에서 이것을 처리하는 것은 놀랍도록 간단하고 오버 헤드가 적지 만 중단이 발생할 때 제어 할 수는 없습니다. 신경 쓰지 않거나 데이터가 자연스럽게 중단되지 않고 긴 영숫자 실행이 있으면 좋습니다. 우리는 긴 파일 경로, URL 및 전화 번호가 많았으며 모두 다른 곳보다 침입하기가 훨씬 낫습니다.
우리의 해결책은 먼저 정규식 대체를 사용하여 공백이 아닌 15 자 또는 공백을 선호하는 특수 문자 중 하나 (예 : 15 자)마다 너비가없는 공백 (& # 8203;)을 넣는 것입니다. 그런 다음 특수 문자 다음에 너비가 0 인 공백을두기 위해 다른 대체 작업을 수행합니다.
너비가 0 인 공간은 화면에 표시되지 않기 때문에 좋습니다. 부끄러운 하이픈은 데이터에 중요한 하이픈이 있기 때문에 혼란 스러웠습니다. 브라우저에서 텍스트를 복사 할 때 너비가 0 인 공백도 포함되지 않습니다.
현재 사용중인 특수 구분 문자는 마침표, 슬래시, 백 슬래시, 쉼표, 밑줄, @, | 및 하이픈입니다. 하이픈 다음에 줄 바꿈을 장려하기 위해 어떤 조치도 취할 필요는 없다고 생각하지만 Firefox (최소 3.6 및 4)는 전화 번호와 같은 숫자로 둘러싸인 하이픈에서 그 자체로 중단되지 않습니다.
또한 사용 가능한 레이아웃 공간을 기준으로 인공 나누기 사이의 문자 수를 제어하려고했습니다. 그것은 긴 비정규 실행과 일치하는 정규식이 역동적이어야한다는 것을 의미했습니다. 이것은 많이 불려지고 성능상의 이유로 동일한 동일한 정규 표현식을 반복해서 만들고 싶지 않기 때문에 정규 표현식과 그 플래그로 키가 지정된 간단한 정규 표현식 캐시를 사용했습니다.
코드는 다음과 같습니다. 유틸리티 패키지의 함수 네임 스페이스는 아마도 다음과 같습니다.
makeWrappable = function(str, position)
{
if (!str)
return '';
position = position || 15; // default to breaking after 15 chars
// matches every requested number of chars that's not whitespace or one of the special chars defined below
var longRunsRegex = cachedRegex('([^\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^\\s\\.\/\\,_@\\|-])', 'g');
return str
.replace(longRunsRegex, '$1​') // put a zero-width space every requested number of chars that's not whitespace or a special char
.replace(makeWrappable.SPECIAL_CHARS_REGEX, '$1​'); // and one after special chars we want to allow breaking after
};
makeWrappable.SPECIAL_CHARS_REGEX = /([\.\/\\,_@\|-])/g; // period, forward slash, backslash, comma, underscore, @, |, hyphen
cachedRegex = function(reString, reFlags)
{
var key = reString + (reFlags ? ':::' + reFlags : '');
if (!cachedRegex.cache[key])
cachedRegex.cache[key] = new RegExp(reString, reFlags);
return cachedRegex.cache[key];
};
cachedRegex.cache = {};
다음과 같이 테스트하십시오.
makeWrappable('12345678901234567890 12345678901234567890 1234567890/1234567890')
업데이트 2 : 실제로 는 폭이 0 인 공간 이 복사 된 텍스트에 포함되어 있습니다. 분명히 사람들에게 숨겨진 문자가있는 텍스트를 복사하도록 장려하는 것은 문제를 일으킬 수있는 다른 프로그램이나 시스템에 입력 한 것과 같은 데이터를 갖도록 초대하는 것입니다. 예를 들어, 데이터베이스에서 종료되면 검색에 실패하고 이와 같은 검색 문자열도 실패 할 수 있습니다. 이와 같이 데이터를 이동하기 위해 화살표 키를 사용하려면 보이지 않는 캐릭터를 이동할 수있는 추가 키 누르기가 필요합니다.
닫힌 시스템에서는 입력시 해당 문자를 필터링하여 자신을 보호 할 수 있지만 다른 프로그램과 시스템에는 도움이되지 않습니다.
모두들 말하지만,이 기술은 잘 작동하지만 최고의 깨짐 원인이 무엇인지 확실하지 않습니다.
업데이트 3 : 이 캐릭터가 데이터로 끝나는 것은 더 이상 이론적 인 가능성이 아니며 관찰 된 문제입니다. 사용자가 화면에서 복사 한 데이터를 제출하면 DB에 저장되고 검색이 중단되고 이상한 일이 발생합니다.
우리는 두 가지 일을했습니다.
- 유틸리티를 작성하여이 앱의 모든 데이터 소스에있는 모든 테이블의 모든 열에서 제거했습니다.
- 표준 문자열 입력 프로세서로 제거하기 위해 필터링을 추가 했으므로 코드가 인식 할 때마다 사라졌습니다.
이것은 기술 자체와 마찬가지로 잘 작동하지만 경고입니다.
업데이트 4 : 우리는 이것에 공급 된 데이터가 HTML 이스케이프 될 수있는 상황에서 이것을 사용하고 있습니다. 올바른 환경에서 HTML 엔터티 중간에 너비가 0 인 공백을 삽입하여 펑키 한 결과를 얻을 수 있습니다.
다음과 같이 우리가 나누지 않는 문자 목록에 앰퍼샌드를 추가하는 것이 수정되었습니다.
var longRunsRegex = cachedRegex('([^&\\s\\.\/\\,_@\\|-]{' + position + '})(?=[^&\\s\\.\/\\,_@\\|-])', 'g');