2009-08-31 5 views
4

XML 문서를 문자열 변수에 잘 형식화했습니다. preg_replace를 사용하여 모든 xml 태그에 정의 된 속성을 추가하려고합니다. 임의의 xml 태그에 속성을 추가하는 Regexp

예를 들어 대체 :

<tag1> 
<tag2> some text </tag2> 
</tag1> 

기준 :

<tag1 attr="myAttr"> 
<tag2 attr="myAttr"> some text </tag2> 
</tag1> 

그래서 나는 기본적으로 모든 시작 태그를 찾아 내 속성을 추가 정규식 표현이 필요하지만, 나는 완전한 정규식 멍청한 놈입니다.

답변

13

xml 작업에 정규 표현식을 사용하지 마십시오. Xml은 일반 언어가 아닙니다. 사용하여 xml extensions of php 대신 :이 라인을 읽는 사람들을 위해,

<?xml version="1.0" encoding='UTF-8'?> 
<html> 
    <head> 
     <!-- <meta> ... </meta> --> 
     <script>//<![CDATA[ 
      function load() {document.write('<tt>Test</tt>');} 
     //]]></script> 
     <title><![CDATA[Fancy <<SiteName>> [with Breadcrumbs] > in > title]]></title> 
    </head> 
    <body onload="load()"> 
     <input 
      type="submit" 
      value="multiline 
        button 
        text" 
     /> 
    </body> 
</html> 
+0

xml에 regex를 사용하는 것이 더러움을 이해하지만, 제 경우에는이 속성들을 'regex safe'xml doc에 추가하려고합니다. 지적 해 주셔서 감사합니다. –

+0

btw 나는 simpleXML로 작업하는 데 필요한 몇 가지 코드에 놀랐다. 코드를 시도했지만 문서의 끝 태그 인 {attr = "myAttr"/> 요소를 추가한다. –

+0

ok 약간의 변경을했다. 그 하나 나를 위해 일하는 addAttribute ($ name, $ value) 대신 특성 [] 및 foreach 문 $ xmlNode-> children() 괄호가 필요합니다. 다시 thx! –

0
$xml_data = preg_replace("/<([^\/]+\w+)/", "<\\1 attr=\"myAttr\">", $xml_data); 
+0

arrrg 거의 모든 작업을 수행하고 있습니다. excep는 'attr = "myAttr">을 각각의 CDATA 부분에 추가합니다. 노드가 아니라 속성으로 ... 어떤 생각? –

+3

네, 그렇습니다. 왜 사람들은 대소 문자와 그와 동등한 구문 때문에 정규 표현식과 XML을 섞지 않는 것이 좋습니다. 하지만 절대 100 % 합법적이고 일관된 XML에서만 사용하게 될 것입니다. 그렇습니까? – Rob

0

OK 여전히 정규식 방법을 사용에 대한 관심이 : 예를 들어,이 유효한 XML을 깰 것이다 정규 표현식을 포함

$xml = new SimpleXml(file_get_contents($xmlFile)); 
function process_recursive($xmlNode) { 
    $xmlNode->addAttribute('attr', 'myAttr'); 
    foreach ($xmlNode->children() as $childNode) { 
     process_recursive($childNode); 
    } 
} 
process_recursive($xml); 
echo $xml->asXML(); 

모든 답변 몇 가지 이유가 여기에 있습니다 :

$xml_data= preg_replace('/(<[A-Za-z0-9\-\_]+[^>]*)>/u','\1 attr="myAttr">',$xmlData); 

그러나 앞에서 설명한 것처럼주의해서 사용해야합니다. XML 원본에서 깨질 염려가없는 부분 만 사용하십시오 (soulmerge 게시물을 참조하십시오)

관련 문제