2013-04-18 3 views
0

문자열에 svg가 저장되어 있습니다. 그 부분은 다음과 같습니다 :정규식을 사용하여 XML 속성 값 바꾸기

var str = '<svg version="1.1" width="1400px">'; 

나는 주어진 속성 값을 대체 할 솔루션을 찾고 있습니다. 나는 width을 변경하고자한다면 지금 내가하고있어 다음

var prop = "width"; 
var newValue = "100px"; 
var regex = new RegExp(prop + '="[^"]*'); 
str = str.replace(regex, prop + '="' + newValue); 

내가 나중에 문자열을 구축해야 해달라고 있도록 하나의 정규 표현식이 할 수있는 방법이 있습니까?

다른 말로하면 특정 문자열 앞에 따옴표 사이의 텍스트 만 선택하는 정규식이란 무엇입니까? 더 나은

fill="**howCanISelectThisText?**"

+1

이 왜 이것에 대한 XML 파서를 사용하는? – rcdmk

+0

XML 파서를 사용하고 싶지 않습니다. 왜냐하면이 파일을 CSS 파일에 포함시켜 데이터 URI로 인코딩하기 때문입니다. 그 무의미하게 무거운. –

+0

예, Reggy에서 테스트했을 때 작동했습니다. POSIX에서는 잘 모르겠다. –

답변

3

버퍼를 사용하고 실제 HTML 객체로 취급하는;

JSfiddle

HTML

<div id="hidden"></div> 

CSS

#hidden { 
    display: none; 
} 

자바 스크립트

var hidden = document.getElementById('hidden'); 
var str = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" fill="#ffffff" width="1400px" height="180px" viewBox="0 0 1400 180" enable-background="new 0 0 1400 180" xml:space="preserve">'; 
hidden.innerHTML = str; 

var prop = "width"; 
var newValue = "100px"; 

var svgObject = hidden.getElementsByTagName('svg')[0]; 
svgObject.setAttribute(prop, newValue) 

console.log(svgObject.getAttribute('width')); 

// Done 
str = hidden.innerHTML; 

// When you're done, empty hidden buffer 
hidden.innerHTML = ''; 
+0

+1은 메모리에있는 요소 만 사용하여 게시하려고했습니다. 'var el = document.createElement ("div"); el.innerHTML = str + "";'및'el.firstChild.getAttribute ... ' –

+0

가상은 예와 마찬가지로 작동합니다. 나는 때때로 시각적 인 참조를하는 것을 좋아한다. 당연히 그 DOM 요소를 항상 가상화할 수 있습니다. –

3

이것은 이 아니라 정규 표현식에 대한 직업입니다! 이것은 XML 구문 분석기에 대한 작업입니다. 모든 "현대"브라우저 (즉, IE 9 이상)에는 하나의 기본 제공 브라우저가 있어야합니다. DOMParser이라고합니다.

문서 : https://developer.mozilla.org/en-US/docs/Parsing_and_serializing_XML

그것은 사용하기 매우 간단합니다, 정규 표현식에보다 더 쉽게! 다음은 예입니다 :

var str = '<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" fill="#ffffff" width="1400px" height="180px" viewBox="0 0 1400 180" enable-background="new 0 0 1400 180" xml:space="preserve">'; 

var parser = new DOMParser; 
var serializer = new XMLSerializer; 

// Your string doesn't have a close tag, it won't parse without one 
var doc = parser.parseFromString(str+'</svg>', 'application/xml'); 

doc.documentElement.setAttribute('width', '100px'); 

// The serializer will self-close the element, let's remove that 
str = serializer.serializeToString(doc).replace('/>', '>'); 

console.log(str); 

DEMO : http://jsfiddle.net/qpu33/

관련 문제