2016-12-01 6 views
1

を使用して独自のタグにアンカーのhrefを変換:は、私は、このサンプル・データを持っている正規表現とJavaScript

<products_database> 
<product> 
     <id>##1234 
     <a name ="toy">toy</a> 
     <weight>5kg 
     <a href ="#block">block</a> 
</product> 
<product> 
      <id>##56789 
      <a name ="brick">brick</a> 
      <a name ="lego">lego</a> 
      <a name ="block">block</a> 
      <weight>2kg 
      <a href ="#toy">toy</a> 
</product> 
<product> 
      <id>##1357902 
      <a href ="#toy">toy</a> 
      <a href ="#brick">brick</a> 
      <weight>4kg 
</product> 
</product_database> 

私はへのhrefを変換したい:hrefのがに変換する

<products_database> 
<product> 
     <id>##1234 
     <a name ="toy">toy</a> 
     <weight>5kg 
     <..pd ##56789 #block>block</a> 
</product> 
<product> 
      <id>##56789 
      <a name ="brick">brick</a> 
      <a name ="lego">lego</a> 
      <a name ="block">block</a> 
      <weight>2kg 
      <..pd ##1234 #toy>toy</a> 
</product> 
<product> 
      <id>##1357902 
      <..pd ##1234 #toy>toy</a> 
      <..pd ##56789 #brick>brick</a> 
      <weight>4kg 
</product> 

この "a href"の値が "a name"と等しい個々の "製品"の "id"を取得するこのユニークなタグです。私はjavascriptと正規表現を使用することを許可されています。

+0

ええ、私は私の予想される出力についてはかなり確信しています。これまでは名前とIDをハッシュに入れてみたかったのですが、構文に詳しいわけではありません。 – Xavia

+0

これまでのコードは書いてありますか?それをさらに発展させる方法を提案するのを助けることができたら、私たちに教えてください。 – Whothehellisthat

+0

2日以上前に二人であなたを助けましたが、感謝や他のコメントはありません:( – Fallenhero

答えて

1

あなたは何をする必要があるのか​​正確に把握し、必要なことをする可能性のある解決策を書いてみました。

//var findProduct = /<product>\s+<id>(##\d+)\s+((?:<a name ="[^"]+">[^<]+<\/a>)+)\s+<weight>(\d+kg)\s+((?:<a href ="#[^"]+">[^<]+<\/a>)+)\s+<\/product>/g; 
 

 
var byName = {}, products = []; 
 

 
var findProduct = /<product>\s+([\W\w]+?)\s+<\/product>/g; 
 
var findTag = /<([\w]+)(?: (name|href) ="#?([^"]+)")?>([^<\n\r]+)/g; 
 

 
var data = document.getElementById("data").value; 
 
data.replace(findProduct, function(match, tags) { 
 
    var product = { 
 
    id: "", names: [], weight: "", links: [] 
 
    }; 
 
    tags.replace(findTag, function(match, tagName, attr, attrValue, tagValue) { 
 
    switch (tagName) { 
 
     case "id": product.id = tagValue; break; 
 
     case "weight": product.weight = tagValue; break; 
 
     case "a": 
 
     if (attr === "name") { product.names.push(attrValue); byName[attrValue] = product; } 
 
     else /* if (attr === "href") */ { product.links.push(attrValue); } 
 
     break; 
 
    } 
 
    }); 
 
    products.push(product); 
 
}); 
 

 
data = "<product_database>" + products.map(function(product) { 
 
    return "<product><id>" + product.id + "\n<weight>" + product.weight + "\n" + 
 
    product.names.map(function(name) { 
 
     return "<a name =\"" + name + "\">" + name + "</a>"; 
 
    }).join("\n") + 
 
    product.links.map(function(link) { 
 
     return "<..pd " + byName[link].id + " #" + link + ">block</a>"; 
 
    }).join("\n") 
 
    + "\n</product>"; 
 
}).join("\n") + "</product_database>"; 
 

 
document.getElementById("data").value = data;
<textarea id="data" cols=50 rows=30><products_database> 
 
<product> 
 
     <id>##1234 
 
     <a name ="toy">toy</a> 
 
     <weight>5kg 
 
     <a href ="#block">block</a> 
 
</product> 
 
<product> 
 
      <id>##56789 
 
      <a name ="brick">brick</a> 
 
      <a name ="lego">lego</a> 
 
      <a name ="block">block</a> 
 
      <weight>2kg 
 
      <a href ="#toy">toy</a> 
 
</product> 
 
<product> 
 
      <id>##1357902 
 
      <a href ="#toy">toy</a> 
 
      <a href ="#brick">brick</a> 
 
      <weight>4kg 
 
</product> 
 
</product_database></textarea>

1

それとも、この(主に正規表現のアプローチ)を使用することができますが、私は、エラー耐性、これはどのように確認していない:2 regexsがあり

var a = '<products_database>\n<product>\n   <id>##1234\n   <a name ="toy">toy</a>\n   <weight>5kg\n   <a href ="#block">block</a>\n</product>\n<product>\n   <id>##56789\n   <a name ="brick">brick</a>\n   <a name ="lego">lego</a>\n   <a name ="block">block</a>\n   <weight>2kg\n   <a href ="#toy">toy</a>\n</product>\n<product>\n   <id>##1357902\n   <a href ="#toy">toy</a>\n   <a href ="#brick">brick</a>\n   <weight>4kg\n</product>\n</product_database>'; 

while (a.match(/(?:<id>(##\d+)((?:[\s\S](?!<id))*?<a name =")(.+?)("[\S\s]*?)<a href ="#\3">|<a href ="#(.+?)">([\S\s]*?)<id>(##\d+)((?:[\s\S](?!<id))*?<a name =")\1")/g) != null) { 
    a = a.replace(/<id>(##\d+)((?:[\s\S](?!<id))*?<a name =")(.+?)("[\S\s]*?)<a href ="#\3">/g, '<id>$1$2$3$4<.. pd $1 #$3>').replace(/<a href ="#(.+?)">([\S\s]*?)<id>(##\d+)((?:[\s\S](?!<id))*?<a name =")\1"/gm, '<.. pd $3 #$1>$2<id>$3$4$1"'); 
} 

a; 

)1. idがhrefの前に来る場合の照合

2.)idがhrefの後に来る場合の一致

regexはidと何度も一致しないので、ループする必要があります。

明確でないかどうか質問してください。

関連する問題